reactive method dispatch for context-oriented programming · context-oriented programming promoter:...

98
Engineer Bainomugisha Reactive Method Dispatch for Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel, Belgium Ph.D. Public Defence 12th December 2012

Upload: others

Post on 04-Jul-2020

48 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Engineer Bainomugisha

Reactive Method Dispatch for Context-Oriented Programming

Promoter: Prof. Dr. Wolfgang De Meuter

Software Languages Lab.Vrije Universiteit Brussel, Belgium

Ph.D. Public Defence12th December 2012

Page 2: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Roadmap

2

Motivation

����

�����

Sorry. You need to correct the fields marked below

before continuing.

Issues

Reactive context-aware applications

Characteristics

Programming Language Approach

The ICoDE Model

The Flute Language

Language Requirements

State of the Art

Semantics and Validation

iScheme

An Executable Semantics for Flute

Validation

����

�����

Sorry. You need to correct the fields marked below

before continuing.

����

�����

Sorry. You need to correct the fields marked below

before continuing.

����

�����

Sorry. You need to correct the fields marked below

before continuing.

Page 3: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Motivation

����

�����

Sorry. You need to correct the fields marked below

before continuing.

Issues

Reactive context-aware applications

Characteristics

Motivation

3

Page 4: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

4

����

�����

Sorry. You need to correct the fields marked below

before continuing.

Sensor Equipment Mobile Devices

GPS

Camera

Compass

Accelerometer

RFID

Page 5: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

5

Reactive Context-aware

Applications

Sensor Equipment Mobile Devices

����

�����

Sorry. You need to correct the fields marked below

before continuing.

Page 6: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Reactive Context-aware Applications

6

����

�����

Sorry. You need to correct the fields marked below

before continuing.

@Office

@Printer room

@Conference room

@Car

Page 7: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

7

����

�����

Sorry. You need to correct the fields marked below

before continuing.

Reactive Context-aware Applications@Office

@Printer room

@Conference room

@Car

Page 8: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

8

����

�����

Sorry. You need to correct the fields marked below

before continuing.

Reactive Context-aware Applications@Office

@Printer room

@Conference room

@Car

Page 9: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

9

����

�����

Sorry. You need to correct the fields marked below

before continuing.

Reactive Context-aware Applications@Office

@Printer room

@Conference room

@Car

Page 10: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

10

����

�����

Sorry. You need to correct the fields marked below

before continuing.

Reactive Context-aware Applications@Office

@Printer room

@Conference room

@Car

Page 11: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

11

to-call

to-call

����

�����

Sorry. You need to correct the fields marked below

before continuing.

task guide

business contacts

co-workers

Reactive Context-aware Applications@Office

@Printer room

@Conference room

@Car

Page 12: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

12

@Office

@Printer room

@Conference room

@Car

to-call

to-call

����

�����

Sorry. You need to correct the fields marked below

before continuing.

task guide

business contacts

co-workers

Reactive Context-aware Applications

1. Context-constrained executions.2. Sudden interruptions.3. Prompt adaptability.

Fundamental Characteristics:

Page 13: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

13

Programming Reactive Context-aware Applications

1 (define call-from-car2 (lambda (contacts-list)3 (show "calling business contacts")4 (if (null? contacts-list)5 (show "business contacts list empty")6 (let ((contact (car contacts-list)))7 (show (contact-name contact))8 (dial (phone-number contact))9 (turn-on-phone-speaker)10 (connect-to-car-speakers)11 (if (dial-next-contact? (user-response))12 (call-from-car (cdr contacts-list)))))))

Page 14: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

14

Programming Reactive Context-aware Applications

1 (define call-from-car2 (lambda (contacts-list)3 (show "calling business contacts")4 (if (null? contacts-list)5 (show "business contacts list empty")6 (let ((contact (car contacts-list)))7 (show (contact-name contact))8 (dial (phone-number contact))9 (turn-on-phone-speaker)10 (connect-to-car-speakers)11 (if (dial-next-contact? (user-response))12 (call-from-car (cdr contacts-list)))))))

Page 15: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

15

1 (define call-from-car2 (lambda (contacts-list)3 (show "calling business contacts")4 (if (null? contacts-list)5 (show "business contacts list empty")6 (let ((contact (car contacts-list)))7 (show (contact-name contact))8 (dial (phone-number contact))9 (turn-on-phone-speaker)10 (connect-to-car-speakers)11 (if (dial-next-contact? (user-response))12 (call-from-car (cdr contacts-list)))))))

Programming Reactive Context-aware Applications

Page 16: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

16

1 (define call-from-car2 (lambda (contacts-list)3 (show "calling business contacts")4 (if (null? contacts-list)5 (show "business contacts list empty")6 (let ((contact (car contacts-list)))7 (show (contact-name contact))8 (dial (phone-number contact))9 (turn-on-phone-speaker)10 (connect-to-car-speakers)11 (if (dial-next-contact? (user-response))12 (call-from-car (cdr contacts-list)))))))

Programming Reactive Context-aware Applications

Page 17: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

17

1 (define call-from-car2 (lambda (contacts-list)3 (show "calling business contacts")4 (if (null? contacts-list)5 (show "business contacts list empty")6 (let ((contact (car contacts-list)))7 (show (contact-name contact))8 (dial (phone-number contact))9 (turn-on-phone-speaker)10 (connect-to-car-speakers)11 (if (dial-next-contact? (user-response))12 (call-from-car (cdr contacts-list)))))))

Programming Reactive Context-aware Applications

Page 18: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

18

1 (define call-from-car2 (lambda (contacts-list)3 (show "calling business contacts")4 (if (null? contacts-list)5 (show "business contacts list empty")6 (let ((contact (car contacts-list)))7 (show (contact-name contact))8 (dial (phone-number contact))9 (turn-on-phone-speaker)10 (connect-to-car-speakers)11 (if (dial-next-contact? (user-response))12 (call-from-car (cdr contacts-list)))))))

Programming Reactive Context-aware Applications

Page 19: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

19

1 (define call-from-car2 (lambda (contacts-list)3 (show "calling business contacts")4 (if (null? contacts-list)5 (show "business contacts list empty")6 (let ((contact (car contacts-list)))7 (show (contact-name contact))8 (dial (phone-number contact))9 (turn-on-phone-speaker)10 (connect-to-car-speakers)11 (if (dial-next-contact? (user-response))12 (call-from-car (cdr contacts-list)))))))

Programming Reactive Context-aware Applications

Page 20: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

20

1 (define call-from-car2 (lambda (contacts-list)3 (show "calling business contacts")4 (if (null? contacts-list)5 (show "business contacts list empty")6 (let ((contact (car contacts-list)))7 (show (contact-name contact))8 (dial (phone-number contact))9 (turn-on-phone-speaker)10 (connect-to-car-speakers)11 (if (dial-next-contact? (user-response))12 (call-from-car (cdr contacts-list)))))))

Programming Reactive Context-aware Applications

Page 21: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

21

1 (define call-from-car2 (lambda (contacts-list)3 (show "calling business contacts")4 (if (null? contacts-list)5 (show "business contacts list empty")6 (let ((contact (car contacts-list)))7 (show (contact-name contact))8 (dial (phone-number contact))9 (turn-on-phone-speaker)10 (connect-to-car-speakers)11 (if (dial-next-contact? (user-response))12 (call-from-car (cdr contacts-list)))))))

Programming Reactive Context-aware Applications

Page 22: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

22

1 (define call-from-car2 (lambda (contacts-list)3 (show "calling business contacts")4 (if (null? contacts-list)5 (show "business contacts list empty")6 (let ((contact (car contacts-list)))7 (show (contact-name contact))8 (dial (phone-number contact))9 (turn-on-phone-speaker)10 (connect-to-car-speakers)11 (if (dial-next-contact? (user-response))12 (call-from-car (cdr contacts-list)))))))

Context-independent

Programming Reactive Context-aware Applications

Page 23: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

23

(if (is-in-car? location) (call-from-car business-contacts))

Programming Reactive Context-aware Applications

Page 24: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

24

call-from-car(call-from-car business-contacts)

A context change can occur at any moment

during a procedure execution

(if (is-in-car? location) (call-from-car business-contacts))

Not enough!

Incorrect!

Programming Reactive Context-aware Applications

Page 25: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

25

?

1. How to constrain an entire procedure execution to the right context?

2. What to do when a context change occurs in the middle of an ongoing execution?

1 (define call-from-car2 (lambda (contacts-list)3 (show "calling business contacts")4 (if (null? contacts-list)5 (show "business contacts list is empty")6 (let ((contact (car contacts-list)))7 (show (contact-name contact))8 (dial (phone-number contact))9 (turn-on-phone-speaker)10 (connect-to-car-speakers)11 (if (dial-next-contact? (user-response))12 (call-from-car (cdr contacts-list)))))))

Fundamental Research Questions:

Programming Reactive Context-aware Applications

Page 26: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

26

Manual Checks, Coroutines, Continuations, ...

?1 (define call-from-car2 (lambda (contacts-list)3 (if (is-in-car? location)4 (show "calling business contacts")5 (save/suspend))6 (if (null? contacts-list)7 (show "business contacts list is empty")8 (let ((contact (car contacts-list)))9 (if (is-in-car? location)10 (show (contact-name contact))11 (save/suspend))12 (if (is-in-car? location)13 (dial (phone-number contact))14 (save/suspend))15 (if (is-in-car? location)16 (turn-on-phone-speaker)17 (save/suspend))18 (if (is-in-car? location)19 (connect-to-car-speakers)20 (save/suspend))21 (if (dial-next-contact? (user-response))22 (call-from-car (cdr contacts-list)))))))

Repetitive context checks

Resumptions?

Context management?

Page 27: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

1 (define call-from-car2 (lambda (contacts-list)3 (if (is-in-car? location)4 (show "calling business contacts")5 (save/suspend))6 (if (null? contacts-list)7 (show "business contacts list is empty")8 (let ((contact (car contacts-list)))9 (if (is-in-car? location)10 (show (contact-name contact))11 (save/suspend))12 (if (is-in-car? location)13 (dial (phone-number contact))14 (save/suspend))15 (if (is-in-car? location)16 (turn-on-phone-speaker)17 (save/suspend))18 (if (is-in-car? location)19 (connect-to-car-speakers)20 (save/suspend))21 (if (dial-next-contact? (user-response))22 (call-from-car (cdr contacts-list)))))))

27

Manual Checks, Coroutines, Continuations, ...

Need f

or a d

edica

ted so

ftware

tech

nolog

y

Repetitive context checks

Resumptions?

Context management?

?

Page 28: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

28

Reactive Method Dispatch for Context-Oriented Programming

Programming Language Approach

The ICoDE Model

The Flute Language

Language Requirements

State of the Art

Page 29: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

29

Programming Language Requirements

(is-in-car? location)

(is-in-conference-room? location)

1 (define to-call2 (lambda (contacts-list)3 (show "calling business contacts")4 (if (null? contacts-list)5 (show "business contacts list is empty")6 (let ((contact (car contacts-list)))7 (show (contact-name contact))8 (dial (phone-number contact))9 (turn-on-phone-speaker)10 (connect-to-car-speakers)11 (if (dial-next-contact? (user-response))12 (to-call (cdr contacts-list)))))))

1 (define to-call2 (lambda (contacts-list)3 (show "calling co-workers contacts")4 (if (null? contacts-list)5 (show "co-workers contacts list is empty")6 (let ((contact (car contacts-list)))7 (show (contact-name contact))8 (dial (phone-number contact))9 (turn-on-phone-speaker)10 (connect-to-conference-equipment)11 (if (dial-next-contact? (user-response))12 (to-call (cdr contacts-list)))))))

R.1 Chained Context Reactions

R.2 Contextual Dispatch

R.3 Reactive Dispatch

R.4 Context-dependent Interruptions

R.5 Context-dependent Resumptions

R.6 Reactive Scope Management

Language

Requirements:

Page 30: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

A Survey of the State of the Art

30

Chained Context Reactions

Context-dependent

Interruptions

Context-dependent

Resumptions

Contextual Dispatch

Reactive Dispatch

Reactive Scope Management

Context-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) Languages

ContextL and other Layer-based Languages

Lambic

Ambience

Contextual Values variable scoped construct

Functional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) Languages

FrTime and its Siblings behaviours and events

same function re-evaluation

Reactive SML explicit explicit

Advanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow Constructs

Coroutines explicit explicit

First-class Continuations explicit explicit

Threads (Cooperative) explicit explicit

Other Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language Facilities

Guards blocking at the beginning

from the beginning

Assertions explicit abort

Invariants only at the beginning and the end

Page 31: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Chained Context Reactions

Context-dependent

Interruptions

Context-dependent

Resumptions

Contextual Dispatch

Reactive Dispatch

Reactive Scope Management

Context-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) Languages

ContextL and other Layer-based Languages

Lambic

Ambience

Contextual Values variable scoped construct

Functional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) Languages

FrTime and its Siblings behaviours and events

same function re-evaluation

Reactive SML explicit explicit

Advanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow Constructs

Coroutines explicit explicit

First-class Continuations explicit explicit

Threads (Cooperative) explicit explicit

Other Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language Facilities

Guards blocking at the beginning

from the beginning

Assertions explicit abort

Invariants only at the beginning and the end

A Survey of the State of the Art

31

Page 32: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Chained Context Reactions

Context-dependent

Interruptions

Context-dependent

Resumptions

Contextual Dispatch

Reactive Dispatch

Reactive Scope Management

Context-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) Languages

ContextL and other Layer-based Languages

Lambic

Ambience

Contextual Values variable scoped construct

Functional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) Languages

FrTime and its Siblings behaviours and events

same function re-evaluation

Reactive SML explicit explicit

Advanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow Constructs

Coroutines explicit explicit

First-class Continuations explicit explicit

Threads (Cooperative) explicit explicit

Other Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language Facilities

Guards blocking at the beginning

from the beginning

Assertions explicit abort

Invariants only at the beginning and the end

A Survey of the State of the Art

32

Explici

t Laye

r and

Contex

t Activ

ation,

...

Page 33: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Chained Context Reactions

Context-dependent

Interruptions

Context-dependent

Resumptions

Contextual Dispatch

Reactive Dispatch

Reactive Scope Management

Context-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) Languages

ContextL and other Layer-based Languages

Lambic

Ambience

Contextual Values variable scoped construct

Functional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) Languages

FrTime and its Siblings behaviours and events

same function re-evaluation

Reactive SML explicit explicit

Advanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow Constructs

Coroutines explicit explicit

First-class Continuations explicit explicit

Threads (Cooperative) explicit explicit

Other Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language Facilities

Guards blocking at the beginning

from the beginning

Assertions explicit abort

Invariants only at the beginning and the end

A Survey of the State of the Art

33

Bain

omug

isha,

E. e

t.al.

(201

2). A

Sur

vey

on R

eact

ive P

rogr

amm

ing.

AC

M C

ompu

ting

Surv

eys

(to a

ppea

r).

Page 34: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Chained Context Reactions

Context-dependent

Interruptions

Context-dependent

Resumptions

Contextual Dispatch

Reactive Dispatch

Reactive Scope Management

Context-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) Languages

ContextL and other Layer-based Languages

Lambic

Ambience

Contextual Values variable scoped construct

Functional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) Languages

FrTime and its Siblings behaviours and events

same function re-evaluation

Reactive SML explicit explicit

Advanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow Constructs

Coroutines explicit explicit

First-class Continuations explicit explicit

Threads (Cooperative) explicit explicit

Other Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language Facilities

Guards blocking at the beginning

from the beginning

Assertions explicit abort

Invariants only at the beginning and the end

A Survey of the State of the Art

34

No Con

textua

l

Dispatc

h, ...

Bain

omug

isha,

E. e

t.al.

(201

2). A

Sur

vey

on R

eact

ive P

rogr

amm

ing.

AC

M C

ompu

ting

Surv

eys

(to a

ppea

r).

Page 35: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Chained Context Reactions

Context-dependent

Interruptions

Context-dependent

Resumptions

Contextual Dispatch

Reactive Dispatch

Reactive Scope Management

Context-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) Languages

ContextL and other Layer-based Languages

Lambic

Ambience

Contextual Values variable scoped construct

Functional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) Languages

FrTime and its Siblings behaviours and events

same function re-evaluation

Reactive SML explicit explicit

Advanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow Constructs

Coroutines explicit explicit

First-class Continuations explicit explicit

Threads (Cooperative) explicit explicit

Other Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language Facilities

Guards blocking at the beginning

from the beginning

Assertions explicit abort

Invariants only at the beginning and the end

A Survey of the State of the Art

35

Bain

omug

isha,

E. e

t.al.

(201

2). A

Sur

vey

on R

eact

ive P

rogr

amm

ing.

AC

M C

ompu

ting

Surv

eys

(to a

ppea

r).

Page 36: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Chained Context Reactions

Context-dependent

Interruptions

Context-dependent

Resumptions

Contextual Dispatch

Reactive Dispatch

Reactive Scope Management

Context-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) LanguagesContext-Oriented Programming (COP) Languages

ContextL and other Layer-based Languages

Lambic

Ambience

Contextual Values variable scoped construct

Functional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) LanguagesFunctional Reactive Programming (FRP) Languages

FrTime and its Siblings behaviours and events

same function re-evaluation

Reactive SML explicit explicit

Advanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow Constructs

Coroutines explicit explicit

First-class Continuations explicit explicit

Threads (Cooperative) explicit explicit

Other Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language Facilities

Guards blocking at the beginning

from the beginning

Assertions explicit abort

Invariants only at the beginning and the end

A Survey of the State of the Art

36

Repetit

ive Con

text

Checks

, Man

ual

Resumpti

ons,

...

Bain

omug

isha,

E. e

t.al.

(201

2). A

Sur

vey

on R

eact

ive P

rogr

amm

ing.

AC

M C

ompu

ting

Surv

eys

(to a

ppea

r).

Page 37: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Chained Context Reactions

Context-dependent

Interruptions

Context-dependent

Resumptions

Contextual Dispatch

Reactive Dispatch

Reactive Scope Management

Context-Oriented Programming LanguagesContext-Oriented Programming LanguagesContext-Oriented Programming LanguagesContext-Oriented Programming LanguagesContext-Oriented Programming LanguagesContext-Oriented Programming LanguagesContext-Oriented Programming Languages

ContextL and other Layer-based Languages

Lambic

Ambience

Contextual Values variable scoped construct

Functional Reactive Programming LanguagesFunctional Reactive Programming LanguagesFunctional Reactive Programming LanguagesFunctional Reactive Programming LanguagesFunctional Reactive Programming LanguagesFunctional Reactive Programming LanguagesFunctional Reactive Programming Languages

FrTime and its Siblings behaviours and events

same function re-evaluation

Reactive SML explicit explicit

Advanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow ConstructsAdvanced Control Flow Constructs

Coroutines explicit explicit

First-class Continuations explicit explicit

Threads (Cooperative) explicit explicit

Other Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language Facilities

Guards blocking at the beginning

from the beginning

Assertions explicit abort

Invariants only at the beginning and the end

There is a Need for a New COP Paradigm

37

Reactive Programming +

Context-Oriented Programming+

Implicit Interruptions

Reactive Method Dispatch for Context-Oriented Programming

Bain

omug

isha,

E. e

t.al.

(201

2). A

Sur

vey

on R

eact

ive P

rogr

amm

ing.

AC

M C

ompu

ting

Surv

eys

(to a

ppea

r).

Page 38: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Chained Context Reactions

Context-dependent

Interruptions

Context-dependent

Resumptions

Contextual Dispatch

Reactive Dispatch

Reactive Scope Management

Context-Oriented Programming LanguagesContext-Oriented Programming LanguagesContext-Oriented Programming Languages

ContextL and other Layer-based Languages

Lambic

Ambience

Contextual Values variable scoped construct

Functional Reactive Programming LanguagesFunctional Reactive Programming LanguagesFunctional Reactive Programming Languages

FrTime and its Siblings behaviours and events

same function re-evaluation

Reactive SML explicit explicit

Advanced Control Flow ConstructsAdvanced Control Flow Constructs

Coroutines explicit explicit

First-class Continuations explicit explicit

Threads (Cooperative) explicit explicit

Other Programming Language FacilitiesOther Programming Language FacilitiesOther Programming Language Facilities

Guards blocking at the beginning

from the beginning

Assertions explicit abort

Invariants only at the beginning and the end

There is a Need for a New COP Paradigm

37

Reactive Programming +

Context-Oriented Programming+

Implicit Interruptions

Reactive Method Dispatch for Context-Oriented Programming

Bain

omug

isha,

E. e

t.al.

(201

2). A

Sur

vey

on R

eact

ive P

rogr

amm

ing.

AC

M C

ompu

ting

Surv

eys

(to a

ppea

r).

Page 39: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Programming Language Approach

The ICoDE Model

The Flute Language

Language Requirements

State of the Art

Reactive Method Dispatch for Context-Oriented Programming

38

Page 40: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

The ICoDE Model: Design Space

39

Bainomugisha, E. et.al. (2012). Interruptible Context-dependent Executions: A Fresh Look at Programming Context-aware Applications. SPLASH/OnWard! 2012

Language Property Design Considerations

Property #1 Predicated procedures

D.C #1.1 Associating a context predicate with a procedure - As part of procedure definition - Outside the procedure definition

Property #1 Predicated procedures D.C #1.2 Propagation of context predicates - Dynamic context predicate propagation - Lexical context predicate propagation - No propagation of context predicates

Property #1 Predicated procedures

D.C #1.3 Grouping of related predicated procedures

Property #2 Representation of context as reactive values

Property #3 Reactive dispatchingD.C #3.1 Dealing with ambiguous context predicates

Property #3 Reactive dispatchingD.C #3.2 Handling return values

Property #4 Interruptible executionsD.C #4.1 Implicit interruptions

Property #4 Interruptible executionsD.C #4.2 Explicit interruptions

Property #5 Resumable executionsD.C #5.1 Proactive resumptions

Property #5 Resumable executionsD.C #5.2 Event-driven resumptions

Property #6 Scoped state changes

Page 41: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Programming Language Approach

The ICoDE Model

The Flute Language

Language Requirements

State of the Art

Reactive Method Dispatch for Context-Oriented Programming

40

Page 42: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

41

call-from-car mode

is-in-car?

is-in-conference-room?

Context sourcesas reactive values

Bainomugisha, E. et.al. (2012). Interruptible Context-dependent Executions: A Fresh Look at Programming Context-aware Applications. SPLASH/OnWard! 2012

The ICoDE Model in Flute

call-from-conference-room mode

to-call modal

Page 43: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

42

(to-call)

is-in-car?

is-in-conference-room?

Contextual and Reactive Dispatching

call-from-car mode

call-from-conference-room mode

Context sourcesas reactive values

to-call modal

Page 44: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

43

(to-call)

call-from-car mode

call-from-conference-room mode

is-in-car?

is-in-conference-room?

Contextual and Reactive Dispatching

Context sourcesas reactive values

to-call modal

Page 45: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

44

call-from-car mode

call-from-conference-room mode

is-in-car?

is-in-conference-room?

Contextual and Reactive Dispatching

Context sourcesas reactive values

to-call modal

Page 46: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

45

call-from-car

(to-call)

executing

suspended

resumed

false

true

true again

(is-in-car? location)

Interruptible and Resumable Executions

Page 47: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

46

(define x (ctx-event 1))(define y (+ x 1))(define z (< x y))

Reactive programming:

- Eliminates the use of explicit callbacks.

- Automatic propagation of changes among dependent values.

Procedures are implicitly lifted.

Reactive Programming in Flute

1

+

1

x2y

#tz

<

Dependency graph

Bainomugisha, E. et.al. (2012). A Survey on Reactive Programming. ACM Computing Surveys (to appear).

Page 48: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

47

Reactive programming:

- Eliminates the use of explicit callbacks.

- Automatic propagation of changes among dependent values.

Reactive Programming in Flute

(define x (ctx-event 1))(define y (+ x 1))(define z (< x y))

Procedures are implicitly lifted.

Dependency graph

2

+

1

x3y

#tz

<

Bainomugisha, E. et.al. (2012). A Survey on Reactive Programming. ACM Computing Surveys (to appear).

Page 49: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Bainomugisha, E. et.al. (2012). A Survey on Reactive Programming. ACM Computing Surveys (to appear).

(define gps-coordinates (ctx-event))(define location (gps->location gps-coordinates))

(CURRENT-LOCATION (lambda (latitude longitude) (update-value! gps-coordinates (cons latitude longitude))))

48

Acquiring non-reactive values from sensors.

Reactive Context Sources in FluteReactive context sources

Page 50: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Bainomugisha, E. et.al. (2012). A Survey on Reactive Programming. ACM Computing Surveys (to appear).

(define gps-coordinates (ctx-event))(define location (gps->location gps-coordinates))(define nearby-metro-station (get-metro-station location))

49

Reactive Context Sources in Flute

(show-map nearby-metro-station)

Reactive context sources

Page 51: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

(define call-from-car (mode (to-call) (is-in-car? location) (suspend resume deferred) (lambda () (show "calling business contacts") (if (null? contacts-list) (show "business contacts list is empty") (let ((contact (car contacts-list))) (set! contacts-list (cdr contacts-list)) (show (contact-name contact)) (dial (phone-number contact)) (turn-on-phonespeaker) (connect-to-car-speakers) (if (dial-next-contact? (user-response)) (to-call)))))))

50

Procedure Modal:

Interruption, resumption, and scoping strategies

(define to-call (modal (location) (define num-of-calls 0)))

Procedure Mode:

Context predicateModal

Reactive context source

Shared variable

Procedure Modals and Modes in Flute

Page 52: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

51

(define call-from-car (mode (to-call) (is-in-car? location) (suspend resume deferred) (lambda () (show "calling business contacts") (if (null? contacts-list) (show "business contacts list is empty") (let ((contact (car contacts-list))) (set! contacts-list (cdr contacts-list)) (show (contact-name contact)) (dial (phone-number contact)) (turn-on-phonespeaker) (connect-to-car-speakers) (if (dial-next-contact? (user-response)) (to-call)))))))

(define call-from-conference-room (mode (to-call) (is-in-conference-room? location) (suspend resume deferred) (lambda () (show "calling co-workers contacts") (if (null? contacts-list) (show "co-workers contacts list is empty") (let ((contact (car contacts-list))) (set! contacts-list (cdr contacts-list)) (show (contact-name contact)) (dial (phone-number contact)) (turn-on-phonespeaker) (connect-to-conference-equipment) (if (dial-next-contact? (user-response)) (to-call)))))))

Procedure Modal: (define to-call (modal (location) (define num-of-calls 0)))

Procedure Mode: Shared variable

Procedure Modals and Modes in FluteReactive context source

Page 53: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

52

(mode (contacts-list) (is-in-car? location) (biz-contacts))

Variable Modal:(define contacts-list (modal (location)))

Variable Modes:

(mode (contacts-list) (is-in-conference-room? location) (co-workers-contacts))

Context predicateModal

Value

Variable Modals and Modes in Flute

Page 54: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

53

Different value depending on the current context.

(define call-from-conference-room (mode (to-call) (is-in-conference-room? location) (suspend resume deferred) (lambda () (show "calling co-workers contacts") (if (null? contacts-list) (show "co-workers contacts list is empty") (let ((contact (car contacts-list))) (set! contacts-list (cdr contacts-list)) (show (contact-name contact)) (dial (phone-number contact)) (turn-on-phonespeaker) (connect-to-conference-equipment) (to-call))))))

(define call-from-car (mode (to-call) (is-in-car? location) (suspend resume deferred) (lambda () (show "calling business contacts") (if (null? contacts-list) (show "business contacts list is empty") (let ((contact (car contacts-list))) (set! contacts-list (cdr contacts-list)) (show (contact-name contact)) (dial (phone-number contact)) (turn-on-phonespeaker) (connect-to-car-speakers) (if (dial-next-contact? (user-response)) (to-call)))))))

Variable Modals and Modes in Flute

Page 55: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

54

Scoped assignments

(define call-from-conference-room (mode (to-call) (is-in-conference-room? location) (suspend resume deferred) (lambda () (show "calling co-workers contacts") (if (null? contacts-list) (show "co-workers contacts list is empty") (let ((contact (car contacts-list))) (set! contacts-list (cdr contacts-list)) (show (contact-name contact)) (dial (phone-number contact)) (turn-on-phonespeaker) (connect-to-conference-equipment) (if (dial-next-contact? (user-response)) (to-call)))))))

(define call-from-car (mode (to-call) (is-in-car? location) (suspend resume deferred) (lambda () (show "calling business contacts") (if (null? contacts-list) (show "business contacts list is empty") (let ((contact (car contacts-list))) (set! contacts-list (cdr contacts-list)) (show (contact-name contact)) (dial (phone-number contact)) (turn-on-phonespeaker) (connect-to-car-speakers) (if (dial-next-contact? (user-response)) (to-calll)))))))

Context-dependent Scoping for Modal Variables

Page 56: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

55

Interruption and Resumption Strategies in Flute

suspend

restart

resume

abort

Interruption Strategies

Resumption Strategies

The execution is aborted when its context predicate is no longer satisfied.

The execution is restarted from the beginning.

The execution is suspended and its execution state is saved.

The execution is resumed from where it left off.

Page 57: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

56

Interruption and Resumption Strategies in Flute

Resumption StrategiesResumption Strategies

Interruption StrategiesInterruption StrategiesInterruption Strategies

suspend

restart resume

abort

Page 58: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

57

call-from-car

(set! num-of-calls (+ num-of-calls 1))

immediatedeferred

isolated Changes remain locally visible to the execution.

Changes become visible to other executions on completion.

Changes are immediately visible to other executions.

Scoping of State Changes to Ordinary Variables in Flute

Page 59: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Semantics and Validation

58

Semantics and Validation

iScheme

An Executable Semantics for Flute

Validation

����

�����

Sorry. You need to correct the fields marked below

before continuing.

����

�����

Sorry. You need to correct the fields marked below

before continuing.

����

�����

Sorry. You need to correct the fields marked below

before continuing.

Page 60: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

iScheme: A Mobile Language Laboratory

59

Bainomugisha, E. et.al. (2012). Bringing Scheme Programming to the iPhone - Experience. Software: Practice and Experience, 42(3):331–356.

iScheme

iOS

iScheme

Objective-C

Language Experiments

Linguistic Symbiosis

Access to iOS APIs (Sensors, GUI, ...)

Ambient-Oriented Programming

Page 61: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

iScheme: A Mobile Language Laboratory

60

Language construct Description

OBJC-INSTANCE For instantiating an Objective-C class from within Scheme.

OBJC-SEND Performing message sends to Objective-C instances.

OBJC-CLASS Getting a reference to an Objective-C class.

OBJC_TYPE A generic representation of Objective-C values in Scheme.

SCHEME_CALL Calling Scheme procedures from Objective-C.

service-type For creating a topic to publish or discover a procedure.

export-service For exporting a procedure as a service.

cancel-publication For cancelling a publication.

when-discovered For discovering a procedure under a specified service type.

cancel-subscription For cancelling a subscription..

remote-send! For performing an asynchronous remote invocation without a return value.

remote-send An asynchronous invocation with a return value.

when-resolved For handling return values of remote invocations.

due-in For specifying a maximum time to wait for a return value.

catch For handling exceptions raised during an asynchronous invocation.

Page 62: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

iScheme: A Mobile Language Laboratory

61

Language construct Description

OBJC-INSTANCE For instantiating an Objective-C class from within Scheme.

OBJC-SEND Performing message sends to Objective-C instances.

OBJC-CLASS Getting a reference to an Objective-C class.

OBJC_TYPE A generic representation of Objective-C values in Scheme.

SCHEME_CALL Calling Scheme procedures from Objective-C.

service-type For creating a topic to publish or discover a procedure.

export-service For exporting a procedure as a service.

cancel-publication For cancelling a publication.

when-discovered For discovering a procedure under a specified service type.

cancel-subscription For cancelling a subscription..

remote-send! For performing an asynchronous remote invocation without a return value.

remote-send An asynchronous invocation with a return value.

when-resolved For handling return values of remote invocations.

due-in For specifying a maximum time to wait for a return value.

catch For handling exceptions raised during an asynchronous invocation.

Linguistic symbiosis constructs

Page 63: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

iScheme: A Mobile Language Laboratory

62

Language construct Description

OBJC-INSTANCE For instantiating an Objective-C class from within Scheme.

OBJC-SEND Performing message sends to Objective-C instances.

OBJC-CLASS Getting a reference to an Objective-C class.

OBJC_TYPE A generic representation of Objective-C values in Scheme.

SCHEME_CALL Calling Scheme procedures from Objective-C.

service-type For creating a topic to publish or discover a procedure.

export-service For exporting a procedure as a service.

cancel-publication For cancelling a publication.

when-discovered For discovering a procedure under a specified service type.

cancel-subscription For cancelling a subscription..

remote-send! For performing an asynchronous remote invocation without a return value.

remote-send An asynchronous invocation with a return value.

when-resolved For handling return values of remote invocations.

due-in For specifying a maximum time to wait for a return value.

catch For handling exceptions raised during an asynchronous invocation.

Distribution constructs

Page 64: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Semantics and Validation

iScheme

An Executable Semantics for Flute

Validation

����

�����

Sorry. You need to correct the fields marked below

before continuing.

����

�����

Sorry. You need to correct the fields marked below

before continuing.

����

�����

Sorry. You need to correct the fields marked below

before continuing.

Semantics and Validation

63

Page 65: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

An Executable Semantics for Flute

64

• Flute is implemented as a meta-interpreter on top of iScheme.

• Context sources: GPS, proximity sensor, accelerometer on the iOS.

Bainomugisha, E. et.al. (2012). Bringing Scheme Programming to the iPhone - Experience. Software: Practice and Experience, 42(3):331–356.

iOS

iScheme

Objective-C

The Flute Meta-interpreter

Linguistic Symbiosis

Page 66: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

An Executable Semantics for Flute

65

(define (eval-seq pred-expr config body-exprs args continue env tailcall) (define head (car body-exprs)) (define tail (cdr body-exprs)) (define context-sources (car pred-expr)) (define context-pred (cdr pred-expr))

(define (continue-with-seq value env-after-seq) (eval-seq pred-expr config tail args continue env-after-seq tailcall))

(define (continue-after-context-pred boolean env-after-pred) (if (equal? boolean #f) (begin (save-execution resume-evaluation context-sources) (continue interrupted env-after-pred)) (if (null? tail) (eval head continue env-after-pred tailcall) (eval head continue-with-seq env-after-pred #f))))

(eval context-pred continue-after-context-pred env #f))

(define (eval-modal . exprs) (lambda (continue env tailcall) (define empty-envt '()) (define (lookup variable) (define binding (assoc variable env)) (if (pair? binding) (cdr binding) (meta-level-eval variable (interaction-env)))) (if (pair? exprs) (let* ((params (car exprs)) (args (map lookup params)) (event-sources args) (modal-envt (bind-params params args empty-envt))) (define (continue-after-modal-exprs value env-after-modal-exprs) (continue (make-modal event-sources env-after-modal-exprs) env)) (if (pair? (cdr exprs)) (eval-seq (cdr exprs) continue-after-modal-exprs modal-envt tailcall) (continue-after-modal-exprs '() modal-envt))) (continue (make-modal '() empty-envt) env))))

(define (eval-mode modal-expr pred-expr value-expr . exprs) (lambda (continue env tailcall) (define modal-binding (assoc (car modal-expr) env)) (define (continue-after-value-expr variable-value env-after-value-expr) (define modal (cdr modal-binding)) (let* ((params '()) (modal-envt (modal-env modal)) (mode-envt (append modal-envt env)) (mode-proc (make-proc params (list value-expr) mode-envt)) (mode (make-mode pred-expr mode-proc mode-envt))) (add-mode! modal mode) (continue mode-proc env))) (define (continue-after-config mode-config env-after-value-expr) (define (mode-params exprs) (car (cdr (car exprs)))) (define (mode-exprs exprs) (cdr (cdr (car exprs)))) (define modal (cdr modal-binding)) (let* ((params (mode-params exprs)) (body-exprs (mode-exprs exprs)) (event-sources (modal-event-sources modal)) (modal-envt (modal-env modal)) (mode-envt (append modal-envt env)) (mode-proc (make-c-proc params (cons event-sources pred-expr) mode-config body-exprs mode-envt)) (mode (make-mode pred-expr mode-proc mode-envt))) (add-mode! modal mode) (continue mode-proc env))) (if (pair? exprs) (eval (car value-expr) continue-after-config env #f) (eval value-expr continue-after-value-expr env #f))))

Modal eval

Mode eval

Procedure’s body eval

(define (eval-seq pred-expr config body-exprs args continue env tailcall) (define head (car body-exprs)) (define tail (cdr body-exprs)) (define context-sources (car pred-expr)) (define context-pred (cdr pred-expr))

(define (continue-with-seq value env-after-seq) (eval-seq pred-expr config tail args continue env-after-seq tailcall))

(define (continue-after-context-pred boolean env-after-pred) (if (equal? boolean #f) (begin (save-execution resume-evaluation context-sources) (continue interrupted env-after-pred)) (if (null? tail) (eval head continue env-after-pred tailcall) (eval head continue-with-seq env-after-pred #f))))

(eval context-pred continue-after-context-pred env #f))

Contextual and reactivedispatch eval

(define (eval-modal . exprs) (lambda (continue env tailcall) (define empty-envt '()) (define (lookup variable) (define binding (assoc variable env)) (if (pair? binding) (cdr binding) (meta-level-eval variable (interaction-env)))) (if (pair? exprs) (let* ((params (car exprs)) (args (map lookup params)) (event-sources args) (modal-envt (bind-params params args empty-envt))) (define (continue-after-modal-exprs value env-after-modal-exprs) (continue (make-modal event-sources env-after-modal-exprs) env)) (if (pair? (cdr exprs)) (eval-seq (cdr exprs) continue-after-modal-exprs modal-envt tailcall) (continue-after-modal-exprs '() modal-envt))) (continue (make-modal '() empty-envt) env))))

Reactive values eval

(define (eval-modal . exprs) (lambda (continue env tailcall) (define empty-envt '()) (define (lookup variable) (define binding (assoc variable env)) (if (pair? binding) (cdr binding) (meta-level-eval variable (interaction-env)))) (if (pair? exprs) (let* ((params (car exprs)) (args (map lookup params)) (event-sources args) (modal-envt (bind-params params args empty-envt))) (define (continue-after-modal-exprs value env-after-modal-exprs) (continue (make-modal event-sources env-after-modal-exprs) env)) (if (pair? (cdr exprs)) (eval-seq (cdr exprs) continue-after-modal-exprs modal-envt tailcall) (continue-after-modal-exprs '() modal-envt))) (continue (make-modal '() empty-envt) env))))

Modal invocationeval (define (eval-modal . exprs)

(lambda (continue env tailcall) (define empty-envt '()) (define (lookup variable) (define binding (assoc variable env)) (if (pair? binding) (cdr binding) (meta-level-eval variable (interaction-env)))) (if (pair? exprs) (let* ((params (car exprs)) (args (map lookup params)) (event-sources args) (modal-envt (bind-params params args empty-envt))) (define (continue-after-modal-exprs value env-after-modal-exprs) (continue (make-modal event-sources env-after-modal-exprs) env)) (if (pair? (cdr exprs)) (eval-seq (cdr exprs) continue-after-modal-exprs modal-envt tailcall) (continue-after-modal-exprs '() modal-envt))) (continue (make-modal '() empty-envt) env))))

Variable modal accesseval

(define (eval-modal . exprs) (lambda (continue env tailcall) (define empty-envt '()) (define (lookup variable) (define binding (assoc variable env)) (if (pair? binding) (cdr binding) (meta-level-eval variable (interaction-env)))) (if (pair? exprs) (let* ((params (car exprs)) (args (map lookup params)) (event-sources args) (modal-envt (bind-params params args empty-envt))) (define (continue-after-modal-exprs value env-after-modal-exprs) (continue (make-modal event-sources env-after-modal-exprs) env)) (if (pair? (cdr exprs)) (eval-seq (cdr exprs) continue-after-modal-exprs modal-envt tailcall) (continue-after-modal-exprs '() modal-envt))) (continue (make-modal '() empty-envt) env))))

Scoped assignmentseval

(define (eval expr continue env tailcall) (cond ((symbol? expr) (eval-variable expr continue env)) ((pair? expr) (let ((operator (car expr)) (operands (cdr expr))) ((apply (case operator ((begin) eval-begin ) ((define) eval-define ) ((if) eval-if ) ((lambda) eval-lambda ) ((quote) eval-quote ) ((set!) eval-set! ) ((while) eval-while ) ((let) eval-let ) ((c-let) eval-c-let ) ((let*) eval-let* ) ((continuous) eval-continuous ) ((c-set!) eval-c-set! ) ((c-ref) eval-c-ref ) ((modal) eval-modal ) ((mode) eval-mode ) ((OBJC-SEND) eval-objc-send ) ((OBJC-CLASS) eval-objc-class ) ((OBJC-INSTANCE) eval-objc-instance) (else (eval-application operator))) operands) continue env tailcall))) (else (continue expr env))))

Main eval

Page 67: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

An Executable Semantics for Flute

66

(define (eval-seq pred-expr config body-exprs args continue env tailcall) (define head (car body-exprs)) (define tail (cdr body-exprs)) (define context-sources (car pred-expr)) (define context-pred (cdr pred-expr))

(define (continue-with-seq value env-after-seq) (eval-seq pred-expr config tail args continue env-after-seq tailcall))

(define (continue-after-context-pred boolean env-after-pred) (if (equal? boolean #f) (begin (save-execution resume-evaluation context-sources) (continue interrupted env-after-pred)) (if (null? tail) (eval head continue env-after-pred tailcall) (eval head continue-with-seq env-after-pred #f))))

(eval context-pred continue-after-context-pred env #f))

(define (eval-modal . exprs) (lambda (continue env tailcall) (define empty-envt '()) (define (lookup variable) (define binding (assoc variable env)) (if (pair? binding) (cdr binding) (meta-level-eval variable (interaction-env)))) (if (pair? exprs) (let* ((params (car exprs)) (args (map lookup params)) (event-sources args) (modal-envt (bind-params params args empty-envt))) (define (continue-after-modal-exprs value env-after-modal-exprs) (continue (make-modal event-sources env-after-modal-exprs) env)) (if (pair? (cdr exprs)) (eval-seq (cdr exprs) continue-after-modal-exprs modal-envt tailcall) (continue-after-modal-exprs '() modal-envt))) (continue (make-modal '() empty-envt) env))))

(define (eval-mode modal-expr pred-expr value-expr . exprs) (lambda (continue env tailcall) (define modal-binding (assoc (car modal-expr) env)) (define (continue-after-value-expr variable-value env-after-value-expr) (define modal (cdr modal-binding)) (let* ((params '()) (modal-envt (modal-env modal)) (mode-envt (append modal-envt env)) (mode-proc (make-proc params (list value-expr) mode-envt)) (mode (make-mode pred-expr mode-proc mode-envt))) (add-mode! modal mode) (continue mode-proc env))) (define (continue-after-config mode-config env-after-value-expr) (define (mode-params exprs) (car (cdr (car exprs)))) (define (mode-exprs exprs) (cdr (cdr (car exprs)))) (define modal (cdr modal-binding)) (let* ((params (mode-params exprs)) (body-exprs (mode-exprs exprs)) (event-sources (modal-event-sources modal)) (modal-envt (modal-env modal)) (mode-envt (append modal-envt env)) (mode-proc (make-c-proc params (cons event-sources pred-expr) mode-config body-exprs mode-envt)) (mode (make-mode pred-expr mode-proc mode-envt))) (add-mode! modal mode) (continue mode-proc env))) (if (pair? exprs) (eval (car value-expr) continue-after-config env #f) (eval value-expr continue-after-value-expr env #f))))

Modal eval

Mode eval

Procedure’s body eval

(define (eval-seq pred-expr config body-exprs args continue env tailcall) (define head (car body-exprs)) (define tail (cdr body-exprs)) (define context-sources (car pred-expr)) (define context-pred (cdr pred-expr))

(define (continue-with-seq value env-after-seq) (eval-seq pred-expr config tail args continue env-after-seq tailcall))

(define (continue-after-context-pred boolean env-after-pred) (if (equal? boolean #f) (begin (save-execution resume-evaluation context-sources) (continue interrupted env-after-pred)) (if (null? tail) (eval head continue env-after-pred tailcall) (eval head continue-with-seq env-after-pred #f))))

(eval context-pred continue-after-context-pred env #f))

Contextual and reactivedispatch eval

(define (eval-modal . exprs) (lambda (continue env tailcall) (define empty-envt '()) (define (lookup variable) (define binding (assoc variable env)) (if (pair? binding) (cdr binding) (meta-level-eval variable (interaction-env)))) (if (pair? exprs) (let* ((params (car exprs)) (args (map lookup params)) (event-sources args) (modal-envt (bind-params params args empty-envt))) (define (continue-after-modal-exprs value env-after-modal-exprs) (continue (make-modal event-sources env-after-modal-exprs) env)) (if (pair? (cdr exprs)) (eval-seq (cdr exprs) continue-after-modal-exprs modal-envt tailcall) (continue-after-modal-exprs '() modal-envt))) (continue (make-modal '() empty-envt) env))))

Reactive values eval

(define (eval-modal . exprs) (lambda (continue env tailcall) (define empty-envt '()) (define (lookup variable) (define binding (assoc variable env)) (if (pair? binding) (cdr binding) (meta-level-eval variable (interaction-env)))) (if (pair? exprs) (let* ((params (car exprs)) (args (map lookup params)) (event-sources args) (modal-envt (bind-params params args empty-envt))) (define (continue-after-modal-exprs value env-after-modal-exprs) (continue (make-modal event-sources env-after-modal-exprs) env)) (if (pair? (cdr exprs)) (eval-seq (cdr exprs) continue-after-modal-exprs modal-envt tailcall) (continue-after-modal-exprs '() modal-envt))) (continue (make-modal '() empty-envt) env))))

Modal invocationeval (define (eval-modal . exprs)

(lambda (continue env tailcall) (define empty-envt '()) (define (lookup variable) (define binding (assoc variable env)) (if (pair? binding) (cdr binding) (meta-level-eval variable (interaction-env)))) (if (pair? exprs) (let* ((params (car exprs)) (args (map lookup params)) (event-sources args) (modal-envt (bind-params params args empty-envt))) (define (continue-after-modal-exprs value env-after-modal-exprs) (continue (make-modal event-sources env-after-modal-exprs) env)) (if (pair? (cdr exprs)) (eval-seq (cdr exprs) continue-after-modal-exprs modal-envt tailcall) (continue-after-modal-exprs '() modal-envt))) (continue (make-modal '() empty-envt) env))))

Variable modal accesseval

(define (eval-modal . exprs) (lambda (continue env tailcall) (define empty-envt '()) (define (lookup variable) (define binding (assoc variable env)) (if (pair? binding) (cdr binding) (meta-level-eval variable (interaction-env)))) (if (pair? exprs) (let* ((params (car exprs)) (args (map lookup params)) (event-sources args) (modal-envt (bind-params params args empty-envt))) (define (continue-after-modal-exprs value env-after-modal-exprs) (continue (make-modal event-sources env-after-modal-exprs) env)) (if (pair? (cdr exprs)) (eval-seq (cdr exprs) continue-after-modal-exprs modal-envt tailcall) (continue-after-modal-exprs '() modal-envt))) (continue (make-modal '() empty-envt) env))))

Scoped assignmentseval

(define (eval expr continue env tailcall) (cond ((symbol? expr) (eval-variable expr continue env)) ((pair? expr) (let ((operator (car expr)) (operands (cdr expr))) ((apply (case operator ((begin) eval-begin ) ((define) eval-define ) ((if) eval-if ) ((lambda) eval-lambda ) ((quote) eval-quote ) ((set!) eval-set! ) ((while) eval-while ) ((let) eval-let ) ((c-let) eval-c-let ) ((let*) eval-let* ) ((continuous) eval-continuous ) ((c-set!) eval-c-set! ) ((c-ref) eval-c-ref ) ((modal) eval-modal ) ((mode) eval-mode ) ((OBJC-SEND) eval-objc-send ) ((OBJC-CLASS) eval-objc-class ) ((OBJC-INSTANCE) eval-objc-instance) (else (eval-application operator))) operands) continue env tailcall))) (else (continue expr env))))

Main eval

Page 68: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

67

(define (eval-modal-dispatch modal continue env) (define modes (modal-modes modal)) (define preds (modal-preds modal)) (define true-count-end 1) (define true-count-start 0) (define (iterate preds modes true-count mode-proc modes-after-dispatch) (if (null? preds) (if (= true-count true-count-end) (continue mode-proc env)) (if (< true-count true-count-end) (continue #f env) (error "Ambiguous predicates for procedure modal" true-count))) (let* ((head-pred (car preds)) (tail-preds (cdr preds)) (head-mode (car modes)) (tail-modes (cdr modes)) (mode-envt (mode-env head-mode)) (remaining-modes (cons head-mode modes-after-dispatch)) (head-mode-proc (mode-proc head-mode))) (define (continue-after-pred value env) (if value (iterate tail-preds tail-modes (+ true-count 1) head-mode-proc modes-after-dispatch) (iterate tail-preds tail-modes true-count mode-proc remaining-modes))) (eval head-pred continue-after-pred mode-envt #f)))) (iterate preds modes true-count-start #f '()))

Contextual and Reactive Dispatch Evaluation

Page 69: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

68

(define (eval-modal-dispatch modal continue env) (define modes (modal-modes modal)) (define preds (modal-preds modal)) (define true-count-end 1) (define true-count-start 0) (define (iterate preds modes true-count mode-proc modes-after-dispatch) (if (null? preds) (if (= true-count true-count-end) (continue mode-proc env)) (if (< true-count true-count-end) (continue #f env) (error "Ambiguous predicates for procedure modal" true-count))) (let* ((head-pred (car preds)) (tail-preds (cdr preds)) (head-mode (car modes)) (tail-modes (cdr modes)) (mode-envt (mode-env head-mode)) (remaining-modes (cons head-mode modes-after-dispatch)) (head-mode-proc (mode-proc head-mode))) (define (continue-after-pred value env) (if value (iterate tail-preds tail-modes (+ true-count 1) head-mode-proc modes-after-dispatch) (iterate tail-preds tail-modes true-count mode-proc remaining-modes))) (eval head-pred continue-after-pred mode-envt #f)))) (iterate preds modes true-count-start #f '()))

Contextual and Reactive Dispatch Evaluation

Page 70: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

69

(define (eval-modal-dispatch modal continue env) (define modes (modal-modes modal)) (define preds (modal-preds modal)) (define true-count-end 1) (define true-count-start 0) (define (iterate preds modes true-count mode-proc modes-after-dispatch) (if (null? preds) (if (= true-count true-count-end) (continue mode-proc env)) (if (< true-count true-count-end) (continue #f env) (error "Ambiguous predicates for procedure modal" true-count))) (let* ((head-pred (car preds)) (tail-preds (cdr preds)) (head-mode (car modes)) (tail-modes (cdr modes)) (mode-envt (mode-env head-mode)) (remaining-modes (cons head-mode modes-after-dispatch)) (head-mode-proc (mode-proc head-mode))) (define (continue-after-pred value env) (if value (iterate tail-preds tail-modes (+ true-count 1) head-mode-proc modes-after-dispatch) (iterate tail-preds tail-modes true-count mode-proc remaining-modes))) (eval head-pred continue-after-pred mode-envt #f)))) (iterate preds modes true-count-start #f '()))

Contextual and Reactive Dispatch Evaluation

Page 71: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

70

(define (eval-modal-dispatch modal continue env) (define modes (modal-modes modal)) (define preds (modal-preds modal)) (define true-count-end 1) (define true-count-start 0) (define (iterate preds modes true-count mode-proc modes-after-dispatch) (if (null? preds) (if (= true-count true-count-end) (continue mode-proc env)) (if (< true-count true-count-end) (continue #f env) (error "Ambiguous predicates for procedure modal" true-count))) (let* ((head-pred (car preds)) (tail-preds (cdr preds)) (head-mode (car modes)) (tail-modes (cdr modes)) (mode-envt (mode-env head-mode)) (remaining-modes (cons head-mode modes-after-dispatch)) (head-mode-proc (mode-proc head-mode))) (define (continue-after-pred value env) (if value (iterate tail-preds tail-modes (+ true-count 1) head-mode-proc modes-after-dispatch) (iterate tail-preds tail-modes true-count mode-proc remaining-modes))) (eval head-pred continue-after-pred mode-envt #f)))) (iterate preds modes true-count-start #f '()))

Contextual and Reactive Dispatch Evaluation

Page 72: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

71

(define (eval-modal-dispatch modal continue env) (define modes (modal-modes modal)) (define preds (modal-preds modal)) (define true-count-end 1) (define true-count-start 0) (define (iterate preds modes true-count mode-proc modes-after-dispatch) (if (null? preds) (if (= true-count true-count-end) (continue mode-proc env)) (if (< true-count true-count-end) (continue #f env) (error "Ambiguous predicates for procedure modal" true-count))) (let* ((head-pred (car preds)) (tail-preds (cdr preds)) (head-mode (car modes)) (tail-modes (cdr modes)) (mode-envt (mode-env head-mode)) (remaining-modes (cons head-mode modes-after-dispatch)) (head-mode-proc (mode-proc head-mode))) (define (continue-after-pred value env) (if value (iterate tail-preds tail-modes (+ true-count 1) head-mode-proc modes-after-dispatch) (iterate tail-preds tail-modes true-count mode-proc remaining-modes))) (eval head-pred continue-after-pred mode-envt #f)))) (iterate preds modes true-count-start #f '()))

Contextual and Reactive Dispatch Evaluation

Page 73: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

72

(define (eval-modal-dispatch modal continue env) (define modes (modal-modes modal)) (define preds (modal-preds modal)) (define true-count-end 1) (define true-count-start 0) (define (iterate preds modes true-count mode-proc modes-after-dispatch) (if (null? preds) (if (= true-count true-count-end) (continue mode-proc env)) (if (< true-count true-count-end) (continue #f env) (error "Ambiguous predicates for procedure modal" true-count))) (let* ((head-pred (car preds)) (tail-preds (cdr preds)) (head-mode (car modes)) (tail-modes (cdr modes)) (mode-envt (mode-env head-mode)) (remaining-modes (cons head-mode modes-after-dispatch)) (head-mode-proc (mode-proc head-mode))) (define (continue-after-pred value env) (if value (iterate tail-preds tail-modes (+ true-count 1) head-mode-proc modes-after-dispatch) (iterate tail-preds tail-modes true-count mode-proc remaining-modes))) (eval head-pred continue-after-pred mode-envt #f)))) (iterate preds modes true-count-start #f '()))

Contextual and Reactive Dispatch Evaluation

Page 74: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

73

(define (eval-modal-dispatch modal continue env) (define modes (modal-modes modal)) (define preds (modal-preds modal)) (define true-count-end 1) (define true-count-start 0) (define (iterate preds modes true-count mode-proc modes-after-dispatch) (if (null? preds) (if (= true-count true-count-end) (continue mode-proc env)) (if (< true-count true-count-end) (continue #f env) (error "Ambiguous predicates for procedure modal" true-count))) (let* ((head-pred (car preds)) (tail-preds (cdr preds)) (head-mode (car modes)) (tail-modes (cdr modes)) (mode-envt (mode-env head-mode)) (remaining-modes (cons head-mode modes-after-dispatch)) (head-mode-proc (mode-proc head-mode))) (define (continue-after-pred value env) (if value (iterate tail-preds tail-modes (+ true-count 1) head-mode-proc modes-after-dispatch) (iterate tail-preds tail-modes true-count mode-proc remaining-modes))) (eval head-pred continue-after-pred mode-envt #f)))) (iterate preds modes true-count-start #f '()))

Contextual and Reactive Dispatch Evaluation

Page 75: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

74

(define (eval-modal-dispatch modal continue env) (define modes (modal-modes modal)) (define preds (modal-preds modal)) (define true-count-end 1) (define true-count-start 0) (define (iterate preds modes true-count mode-proc modes-after-dispatch) (if (null? preds) (if (= true-count true-count-end) (continue mode-proc env)) (if (< true-count true-count-end) (continue #f env) (error "Ambiguous predicates for procedure modal" true-count))) (let* ((head-pred (car preds)) (tail-preds (cdr preds)) (head-mode (car modes)) (tail-modes (cdr modes)) (mode-envt (mode-env head-mode)) (remaining-modes (cons head-mode modes-after-dispatch)) (head-mode-proc (mode-proc head-mode))) (define (continue-after-pred value env) (if value (iterate tail-preds tail-modes (+ true-count 1) head-mode-proc modes-after-dispatch) (iterate tail-preds tail-modes true-count mode-proc remaining-modes))) (eval head-pred continue-after-pred mode-envt #f)))) (iterate preds modes true-count-start #f '()))

Contextual and Reactive Dispatch Evaluation

Page 76: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

75

(define (eval-modal-dispatch modal continue env) (define modes (modal-modes modal)) (define preds (modal-preds modal)) (define true-count-end 1) (define true-count-start 0) (define (iterate preds modes true-count mode-proc modes-after-dispatch) (if (null? preds) (if (= true-count true-count-end) (continue mode-proc env)) (if (< true-count true-count-end) (continue #f env) (error "Ambiguous predicates for procedure modal" true-count))) (let* ((head-pred (car preds)) (tail-preds (cdr preds)) (head-mode (car modes)) (tail-modes (cdr modes)) (mode-envt (mode-env head-mode)) (remaining-modes (cons head-mode modes-after-dispatch)) (head-mode-proc (mode-proc head-mode))) (define (continue-after-pred value env) (if value (iterate tail-preds tail-modes (+ true-count 1) head-mode-proc modes-after-dispatch) (iterate tail-preds tail-modes true-count mode-proc remaining-modes))) (eval head-pred continue-after-pred mode-envt #f)))) (iterate preds modes true-count-start #f '()))

(if (ormap event? context-sources) (let* ((dispatcher (ctx-event)) (resumption-point (lambda () (eval-modal-dispatch modal continue-after-dispatch env)))) (set-thunk! dispatcher resumption-point) (for-each (lambda (context-source) (if (event? context-source) (register dispatcher context-source))) (listify context-sources))))

Contextual and Reactive Dispatch Evaluation

Page 77: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

76

(define (eval-modal-dispatch modal continue env) (define modes (modal-modes modal)) (define preds (modal-preds modal)) (define true-count-end 1) (define true-count-start 0) (define (iterate preds modes true-count mode-proc modes-after-dispatch) (if (null? preds) (if (= true-count true-count-end) (continue mode-proc env)) (if (< true-count true-count-end) (continue #f env) (error "Ambiguous predicates for procedure modal" true-count))) (let* ((head-pred (car preds)) (tail-preds (cdr preds)) (head-mode (car modes)) (tail-modes (cdr modes)) (mode-envt (mode-env head-mode)) (remaining-modes (cons head-mode modes-after-dispatch)) (head-mode-proc (mode-proc head-mode))) (define (continue-after-pred value env) (if value (iterate tail-preds tail-modes (+ true-count 1) head-mode-proc modes-after-dispatch) (iterate tail-preds tail-modes true-count mode-proc remaining-modes))) (eval head-pred continue-after-pred mode-envt #f)))) (iterate preds modes true-count-start #f '()))

(if (ormap event? context-sources) (let* ((dispatcher (ctx-event)) (resumption-point (lambda () (eval-modal-dispatch modal continue-after-dispatch env)))) (set-thunk! dispatcher resumption-point) (for-each (lambda (context-source) (if (event? context-source) (register dispatcher context-source))) (listify context-sources))))

Contextual and Reactive Dispatch Evaluation

Page 78: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

77

(define (eval-modal-dispatch modal continue env) (define modes (modal-modes modal)) (define preds (modal-preds modal)) (define true-count-end 1) (define true-count-start 0) (define (iterate preds modes true-count mode-proc modes-after-dispatch) (if (null? preds) (if (= true-count true-count-end) (continue mode-proc env)) (if (< true-count true-count-end) (continue #f env) (error "Ambiguous predicates for procedure modal" true-count))) (let* ((head-pred (car preds)) (tail-preds (cdr preds)) (head-mode (car modes)) (tail-modes (cdr modes)) (mode-envt (mode-env head-mode)) (remaining-modes (cons head-mode modes-after-dispatch)) (head-mode-proc (mode-proc head-mode))) (define (continue-after-pred value env) (if value (iterate tail-preds tail-modes (+ true-count 1) head-mode-proc modes-after-dispatch) (iterate tail-preds tail-modes true-count mode-proc remaining-modes))) (eval head-pred continue-after-pred mode-envt #f)))) (iterate preds modes true-count-start #f '()))

(if (ormap event? context-sources) (let* ((dispatcher (ctx-event)) (resumption-point (lambda () (eval-modal-dispatch modal continue-after-dispatch env)))) (set-thunk! dispatcher resumption-point) (for-each (lambda (context-source) (if (event? context-source) (register dispatcher context-source))) (listify context-sources))))

Contextual and Reactive Dispatch Evaluation

Page 79: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

78

(define (eval-modal-dispatch modal continue env) (define modes (modal-modes modal)) (define preds (modal-preds modal)) (define true-count-end 1) (define true-count-start 0) (define (iterate preds modes true-count mode-proc modes-after-dispatch) (if (null? preds) (if (= true-count true-count-end) (continue mode-proc env)) (if (< true-count true-count-end) (continue #f env) (error "Ambiguous predicates for procedure modal" true-count))) (let* ((head-pred (car preds)) (tail-preds (cdr preds)) (head-mode (car modes)) (tail-modes (cdr modes)) (mode-envt (mode-env head-mode)) (remaining-modes (cons head-mode modes-after-dispatch)) (head-mode-proc (mode-proc head-mode))) (define (continue-after-pred value env) (if value (iterate tail-preds tail-modes (+ true-count 1) head-mode-proc modes-after-dispatch) (iterate tail-preds tail-modes true-count mode-proc remaining-modes))) (eval head-pred continue-after-pred mode-envt #f)))) (iterate preds modes true-count-start #f '()))

(if (ormap event? context-sources) (let* ((dispatcher (ctx-event)) (resumption-point (lambda () (eval-modal-dispatch modal continue-after-dispatch env)))) (set-thunk! dispatcher resumption-point) (for-each (lambda (context-source) (if (event? context-source) (register dispatcher context-source))) (listify context-sources))))

Contextual and Reactive Dispatch Evaluation

Page 80: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

An Executable Semantics for Flute

79

(define (eval-seq pred-expr config body-exprs args continue env tailcall) (define head (car body-exprs)) (define tail (cdr body-exprs)) (define context-sources (car pred-expr)) (define context-pred (cdr pred-expr))

(define (continue-with-seq value env-after-seq) (eval-seq pred-expr config tail args continue env-after-seq tailcall))

(define (continue-after-context-pred boolean env-after-pred) (if (equal? boolean #f) (begin (save-execution resume-evaluation context-sources) (continue interrupted env-after-pred)) (if (null? tail) (eval head continue env-after-pred tailcall) (eval head continue-with-seq env-after-pred #f))))

(eval context-pred continue-after-context-pred env #f))

(define (eval-modal . exprs) (lambda (continue env tailcall) (define empty-envt '()) (define (lookup variable) (define binding (assoc variable env)) (if (pair? binding) (cdr binding) (meta-level-eval variable (interaction-env)))) (if (pair? exprs) (let* ((params (car exprs)) (args (map lookup params)) (event-sources args) (modal-envt (bind-params params args empty-envt))) (define (continue-after-modal-exprs value env-after-modal-exprs) (continue (make-modal event-sources env-after-modal-exprs) env)) (if (pair? (cdr exprs)) (eval-seq (cdr exprs) continue-after-modal-exprs modal-envt tailcall) (continue-after-modal-exprs '() modal-envt))) (continue (make-modal '() empty-envt) env))))

(define (eval-mode modal-expr pred-expr value-expr . exprs) (lambda (continue env tailcall) (define modal-binding (assoc (car modal-expr) env)) (define (continue-after-value-expr variable-value env-after-value-expr) (define modal (cdr modal-binding)) (let* ((params '()) (modal-envt (modal-env modal)) (mode-envt (append modal-envt env)) (mode-proc (make-proc params (list value-expr) mode-envt)) (mode (make-mode pred-expr mode-proc mode-envt))) (add-mode! modal mode) (continue mode-proc env))) (define (continue-after-config mode-config env-after-value-expr) (define (mode-params exprs) (car (cdr (car exprs)))) (define (mode-exprs exprs) (cdr (cdr (car exprs)))) (define modal (cdr modal-binding)) (let* ((params (mode-params exprs)) (body-exprs (mode-exprs exprs)) (event-sources (modal-event-sources modal)) (modal-envt (modal-env modal)) (mode-envt (append modal-envt env)) (mode-proc (make-c-proc params (cons event-sources pred-expr) mode-config body-exprs mode-envt)) (mode (make-mode pred-expr mode-proc mode-envt))) (add-mode! modal mode) (continue mode-proc env))) (if (pair? exprs) (eval (car value-expr) continue-after-config env #f) (eval value-expr continue-after-value-expr env #f))))

Modal eval

Mode eval

Procedure’s body eval

(define (eval-seq pred-expr config body-exprs args continue env tailcall) (define head (car body-exprs)) (define tail (cdr body-exprs)) (define context-sources (car pred-expr)) (define context-pred (cdr pred-expr))

(define (continue-with-seq value env-after-seq) (eval-seq pred-expr config tail args continue env-after-seq tailcall))

(define (continue-after-context-pred boolean env-after-pred) (if (equal? boolean #f) (begin (save-execution resume-evaluation context-sources) (continue interrupted env-after-pred)) (if (null? tail) (eval head continue env-after-pred tailcall) (eval head continue-with-seq env-after-pred #f))))

(eval context-pred continue-after-context-pred env #f))

Contextual and reactivedispatch eval

(define (eval-modal . exprs) (lambda (continue env tailcall) (define empty-envt '()) (define (lookup variable) (define binding (assoc variable env)) (if (pair? binding) (cdr binding) (meta-level-eval variable (interaction-env)))) (if (pair? exprs) (let* ((params (car exprs)) (args (map lookup params)) (event-sources args) (modal-envt (bind-params params args empty-envt))) (define (continue-after-modal-exprs value env-after-modal-exprs) (continue (make-modal event-sources env-after-modal-exprs) env)) (if (pair? (cdr exprs)) (eval-seq (cdr exprs) continue-after-modal-exprs modal-envt tailcall) (continue-after-modal-exprs '() modal-envt))) (continue (make-modal '() empty-envt) env))))

Reactive values eval

(define (eval-modal . exprs) (lambda (continue env tailcall) (define empty-envt '()) (define (lookup variable) (define binding (assoc variable env)) (if (pair? binding) (cdr binding) (meta-level-eval variable (interaction-env)))) (if (pair? exprs) (let* ((params (car exprs)) (args (map lookup params)) (event-sources args) (modal-envt (bind-params params args empty-envt))) (define (continue-after-modal-exprs value env-after-modal-exprs) (continue (make-modal event-sources env-after-modal-exprs) env)) (if (pair? (cdr exprs)) (eval-seq (cdr exprs) continue-after-modal-exprs modal-envt tailcall) (continue-after-modal-exprs '() modal-envt))) (continue (make-modal '() empty-envt) env))))

Modal invocationeval (define (eval-modal . exprs)

(lambda (continue env tailcall) (define empty-envt '()) (define (lookup variable) (define binding (assoc variable env)) (if (pair? binding) (cdr binding) (meta-level-eval variable (interaction-env)))) (if (pair? exprs) (let* ((params (car exprs)) (args (map lookup params)) (event-sources args) (modal-envt (bind-params params args empty-envt))) (define (continue-after-modal-exprs value env-after-modal-exprs) (continue (make-modal event-sources env-after-modal-exprs) env)) (if (pair? (cdr exprs)) (eval-seq (cdr exprs) continue-after-modal-exprs modal-envt tailcall) (continue-after-modal-exprs '() modal-envt))) (continue (make-modal '() empty-envt) env))))

Variable modal accesseval

(define (eval-modal . exprs) (lambda (continue env tailcall) (define empty-envt '()) (define (lookup variable) (define binding (assoc variable env)) (if (pair? binding) (cdr binding) (meta-level-eval variable (interaction-env)))) (if (pair? exprs) (let* ((params (car exprs)) (args (map lookup params)) (event-sources args) (modal-envt (bind-params params args empty-envt))) (define (continue-after-modal-exprs value env-after-modal-exprs) (continue (make-modal event-sources env-after-modal-exprs) env)) (if (pair? (cdr exprs)) (eval-seq (cdr exprs) continue-after-modal-exprs modal-envt tailcall) (continue-after-modal-exprs '() modal-envt))) (continue (make-modal '() empty-envt) env))))

Scoped assignmentseval

(define (eval expr continue env tailcall) (cond ((symbol? expr) (eval-variable expr continue env)) ((pair? expr) (let ((operator (car expr)) (operands (cdr expr))) ((apply (case operator ((begin) eval-begin ) ((define) eval-define ) ((if) eval-if ) ((lambda) eval-lambda ) ((quote) eval-quote ) ((set!) eval-set! ) ((while) eval-while ) ((let) eval-let ) ((c-let) eval-c-let ) ((let*) eval-let* ) ((continuous) eval-continuous ) ((c-set!) eval-c-set! ) ((c-ref) eval-c-ref ) ((modal) eval-modal ) ((mode) eval-mode ) ((OBJC-SEND) eval-objc-send ) ((OBJC-CLASS) eval-objc-class ) ((OBJC-INSTANCE) eval-objc-instance) (else (eval-application operator))) operands) continue env tailcall))) (else (continue expr env))))

Main eval

Page 81: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

80

(define (eval-seq pred-expr config body-exprs args continue env tailcall) (define context-sources (car pred-expr)) (define context-pred (cdr pred-expr)) (define head (car body-exprs)) (define tail (cdr body-exprs))

(define (continue-with-seq value env-after-seq) (eval-seq pred-expr config tail args continue env-after-seq tailcall))

(define (continue-after-context-pred boolean env-after-pred) (if (equal? boolean #f) (begin (save-execution resume-evaluation context-sources) (continue interrupted env-after-pred)) (if (null? tail) (eval head continue env-after-pred tailcall) (eval head continue-with-seq env-after-pred #f))))

(eval context-pred continue-after-context-pred env #f))

Interruptible Evaluation of a Procedure’s Body

Page 82: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

81

(define (eval-seq pred-expr config body-exprs args continue env tailcall) (define context-sources (car pred-expr)) (define context-pred (cdr pred-expr)) (define head (car body-exprs)) (define tail (cdr body-exprs))

(define (continue-with-seq value env-after-seq) (eval-seq pred-expr config tail args continue env-after-seq tailcall))

(define (continue-after-context-pred boolean env-after-pred) (if (equal? boolean #f) (begin (save-execution resume-evaluation context-sources) (continue interrupted env-after-pred)) (if (null? tail) (eval head continue env-after-pred tailcall) (eval head continue-with-seq env-after-pred #f))))

(eval context-pred continue-after-context-pred env #f))

Interruptible Evaluation of a Procedure’s Body

Page 83: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

82

(define (eval-seq pred-expr config body-exprs args continue env tailcall) (define context-sources (car pred-expr)) (define context-pred (cdr pred-expr)) (define head (car body-exprs)) (define tail (cdr body-exprs))

(define (continue-with-seq value env-after-seq) (eval-seq pred-expr config tail args continue env-after-seq tailcall))

(define (continue-after-context-pred boolean env-after-pred) (if (equal? boolean #f) (begin (save-execution resume-evaluation context-sources) (continue interrupted env-after-pred)) (if (null? tail) (eval head continue env-after-pred tailcall) (eval head continue-with-seq env-after-pred #f))))

(eval context-pred continue-after-context-pred env #f))

Interruptible Evaluation of a Procedure’s Body

Page 84: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

83

(define (eval-seq pred-expr config body-exprs args continue env tailcall) (define context-sources (car pred-expr)) (define context-pred (cdr pred-expr)) (define head (car body-exprs)) (define tail (cdr body-exprs))

(define (continue-with-seq value env-after-seq) (eval-seq pred-expr config tail args continue env-after-seq tailcall))

(define (continue-after-context-pred boolean env-after-pred) (if (equal? boolean #f) (begin (save-execution resume-evaluation context-sources) (continue interrupted env-after-pred)) (if (null? tail) (eval head continue env-after-pred tailcall) (eval head continue-with-seq env-after-pred #f))))

(eval context-pred continue-after-context-pred env #f))

Interruptible Evaluation of a Procedure’s Body

Page 85: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Semantics and Validation

84

Semantics and Validation

iScheme

An Executable Semantics for Flute

Validation

����

�����

Sorry. You need to correct the fields marked below

before continuing.

����

�����

Sorry. You need to correct the fields marked below

before continuing.

����

�����

Sorry. You need to correct the fields marked below

before continuing.

Page 86: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Validation: The iFlute Mobile Platform

85

Kalenda: a context-aware calendar assistant.1

Pulinta: a context-aware printer assistant.2

Tasiki: a context-aware task assistant.3

Example apps on the iFlute mobile platform����

�����

Sorry. You need to correct the fields marked below

before continuing.

Page 87: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Validation: The iFlute Mobile Platform

86

Example apps on the iFlute mobile platform����

�����

Sorry. You need to correct the fields marked below

before continuing.

1

2

3

Kalenda: a context-aware calendar assistant.

Pulinta: a context-aware printer assistant.

Tasiki: a context-aware task assistant.

Page 88: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Validation: The iFlute Mobile Platform

87

Example apps on the iFlute mobile platform����

�����

Sorry. You need to correct the fields marked below

before continuing.

1

2

3

Kalenda: a context-aware calendar assistant.

Pulinta: a context-aware printer assistant.

Tasiki: a context-aware task assistant.

Page 89: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

88

flute-appsprocedure modal

calendar-assistantprocedure mode

show-private-agendaprocedure mode

show-public-agendaprocedure mode

agenda procedure modal

printing-assistantprocedure mode

task-assistantprocedure mode

calendars variable modal

bg-colour variable modal

brown-colourvariable mode

personal calendars variable mode

grey-colourvariable mode

public calendars variable mode

printingprocedure modal

regularprocedure mode

confidentialprocedure mode

documentsvariable modal

confidential documentsvariable mode

regular documentsvariable mode

to-call procedure modal

call-co-workersprocedure mode

call-business-people procedure mode

contacts-listvariable modal

co-workers-contactsvariable mode

business-contactsvariable mode

Validation: The iFlute Mobile Platform

����

�����

Sorry. You need to correct the fields marked below

before continuing.

Page 90: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Evaluation

89

Language Construct Satisfied Requirement

ctx-event Enables representing context as reactive values.

mode Enables creation of predicated procedures.

modal Enables grouping related modes.

suspendabortresumerestart

Enables specification of interruption and resumption strategies.

deferredimmediateisolated

Enables specification of a state scoping strategy.

✓ Chained context reactions

✓ Contextual dispatch

✓ Reactive dispatch

✓ Context-dependent interruptions

✓ Context-dependent resumptions

✓ Reactive scope management

Page 91: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Evaluation

90

Language Construct Satisfied Requirement

ctx-event Enables representing context as reactive values.

mode Enables creation of predicated procedures.

modal Enables grouping related modes.

suspendabortresumerestart

Enables specification of interruption and resumption strategies.

deferredimmediateisolated

Enables specification of a state scoping strategy.

✓ Chained context reactions

✓ Contextual dispatch

✓ Reactive dispatch

✓ Context-dependent interruptions

✓ Context-dependent resumptions

✓ Reactive scope management

Page 92: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Evaluation

91

Language Construct Satisfied Requirement

ctx-event Enables representing context as reactive values.

mode Enables creation of predicated procedures.

modal Enables grouping related modes.

suspendabortresumerestart

Enables specification of interruption and resumption strategies.

deferredimmediateisolated

Enables specification of a state scoping strategy.

✓ Chained context reactions

✓ Contextual dispatch

✓ Reactive dispatch

✓ Context-dependent interruptions

✓ Context-dependent resumptions

✓ Reactive scope management

Page 93: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Evaluation

92

Language Construct Satisfied Requirement

ctx-event Enables representing context as reactive values.

mode Enables creation of predicated procedures.

modal Enables grouping related modes.

suspendabortresumerestart

Enables specification of interruption and resumption strategies.

deferredimmediateisolated

Enables specification of a state scoping strategy.

✓ Chained context reactions

✓ Contextual dispatch

✓ Reactive dispatch

✓ Context-dependent interruptions

✓ Context-dependent resumptions

✓ Reactive scope management

Page 94: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

Evaluation

93

Language Construct Satisfied Requirement

ctx-event Enables representing context as reactive values.

mode Enables creation of predicated procedures.

modal Enables grouping related modes.

suspendabortresumerestart

Enables specification of interruption and resumption strategies.

deferredimmediateisolated

Enables specification of a state scoping strategy.

✓ Chained context reactions

✓ Contextual dispatch

✓ Reactive dispatch

✓ Context-dependent interruptions

✓ Context-dependent resumptions

✓ Reactive scope management

Page 95: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

94

context predicate

Limitations and Future Research Directions

• Garbage collection of suspended executions.

• Flute programming language for the real world.

• Ambiguous context predicates.

• Evaluation overhead.

• Data structure mutations for variable modals.

• Distributed interruptions.

Page 96: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

95

context predicate

• Interruptible and resumable executions.• Representation of context as reactive values.• Contextual and reactive dispatch.• Reactive scope management.

Summarising the Contributions

1. The ICoDE model:

3. The Flute programming language and its executable semantics.

2. iScheme: a mobile language experimentation laboratory.

4. The iFlute Platform: a proof-of-concept mobile application platform for reactive context-aware applications.

Page 97: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

96

context predicate

• Interruptible and resumable executions.• Representation of context as reactive values.• Contextual and reactive dispatch.• Reactive scope management.

Summarising the Contributions

1. The ICoDE model:

3. The Flute programming language and its executable semantics.

2. iScheme: a mobile language experimentation laboratory.

4. The iFlute Platform: a proof-of-concept mobile application platform for reactive context-aware applications.Reactive Method Dispatch for Context-Oriented Programming

Page 98: Reactive Method Dispatch for Context-Oriented Programming · Context-Oriented Programming Promoter: Prof. Dr. Wolfgang De Meuter Software Languages Lab. Vrije Universiteit Brussel,

97

context predicate

Supporting Publications1. Journal: E. Bainomugisha, A. Lombide Carreton, T. Van Cutsem, S. Mostinckx, W. De Meuter. A Survey on Reactive Programming. To appear in ACM Computing Surveys, 2012.

2. Conference: E. Bainomugisha, J. Vallejos, C. De Roover, A. Lombide Carreton, W. De Meuter. Interruptible Context-dependent Executions: A Fresh Look at Programming Context-aware Applications. In Proceedings of the ACM SPLASH/Onward! ’12, 2012.

3. Journal: E. Bainomugisha, J. Vallejos, E. Gonzalez Boix, P. Costanza, T. D'Hondt, W. De Meuter. Bringing Scheme Programming to the iPhone - Experience. In Software: Practice and Experience, 2012.

4. Conference: E. Bainomugisha, P. Koosha, J. Vallejos, Y. Berbers, W. De Meuter. Flexub: Dynamic Subscriptions for Publish/Subscribe Systems in MANETs. In 12th IFIP International Conference on Distributed Applications and Interoperable Systems, Lecture Notes in Computer Science, 2012.

5. Book chapter: E. Bainomugisha, A. Cádiz, P. Costanza, W. De Meuter, S. Gonzalez, K. Mens, J. Vallejos, T. Van Cutsem. Language Engineering for Mobile Software. In Handbook of Research on Mobile Software Engineering: Design Implementation and Emergent Applications, IGI Global, 2011.