From Events to Reactions: A Progress Report Tony Garnock-Jones - - PowerPoint PPT Presentation

from events to reactions a progress report
SMART_READER_LITE
LIVE PREVIEW

From Events to Reactions: A Progress Report Tony Garnock-Jones - - PowerPoint PPT Presentation

PLACES 2016, Eindhoven, Netherlands; 20160408 From Events to Reactions: A Progress Report Tony Garnock-Jones tonyg@ccs.neu.edu Northeastern University Joint work with Matthias Felleisen and Sam Caldwell A A B B Networked C C Program D


slide-1
SLIDE 1

PLACES 2016, Eindhoven, Netherlands; 20160408

From Events to Reactions: A Progress Report

Tony Garnock-Jones

tonyg@ccs.neu.edu Northeastern University Joint work with Matthias Felleisen and Sam Caldwell

slide-2
SLIDE 2

A C B D

Networked Program

A B C D

with coordination + internal tasks

Interactivity ⇒ External Concurrency

slide-3
SLIDE 3

A C B D

Networked Program

A B C D

with coordination + internal tasks

Interactivity ⇒ External Concurrency

Internal Organisation Reflects External Concurrency

slide-4
SLIDE 4

A C E B D

Networked Program

A B C D E

with coordination + internal tasks

Interactivity ⇒ External Concurrency

Component startup → interaction → shutdown/failure

slide-5
SLIDE 5

A C E D

Networked Program

A C D E

with coordination + internal tasks

Interactivity ⇒ External Concurrency

Component startup → interaction → shutdown/failure

slide-6
SLIDE 6

Syndicate DSL by example

  • Mapping events to components
  • Managing conversational state
  • Monitoring changes in shared state
slide-7
SLIDE 7
slide-8
SLIDE 8

SYNDICATE

slide-9
SLIDE 9

event × state → [action] × state

slide-10
SLIDE 10

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [keyDown,space] → actor #42

slide-11
SLIDE 11

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [keyDown,space] → actor #42 Actor behaviour function private state unique internal ID

slide-12
SLIDE 12

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [keyDown,space] → actor #42

  • cf. Linda's

“Tuplespaces”

Dataspace: assertions + provenance

slide-13
SLIDE 13

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [keyDown,space] → actor #42 “I, actor #17, assert that the current score is 3.”

slide-14
SLIDE 14

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [keyDown,space] → actor #42 “I, actor #42, assert that the space key is currently held down.”

slide-15
SLIDE 15

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [keyDown,space] → actor #42 Actions carry added and removed assertions actor → environment

slide-16
SLIDE 16

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [keyDown,space] → actor #42 Events carry added and removed assertions environment → actor

slide-17
SLIDE 17

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [keyDown,space] → actor #42 assert( [sprite,player,51,100, ] ), assert( ?[keyDown,★] )

slide-18
SLIDE 18

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [keyDown,space] → actor #42 [sprite,player,51,100, ] → actor #94 ?[keyDown,★] → actor #94 assert( [sprite,player,51,100, ] ), assert( ?[keyDown,★] )

slide-19
SLIDE 19

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [keyDown,space] → actor #42 [sprite,player,51,100, ] → actor #94 ?[keyDown,★] → actor #94 “I, actor #94, am interested in keeping track

  • f assertions of the form [keyDown,★].”
slide-20
SLIDE 20

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [keyDown,space] → actor #42 [sprite,player,51,100, ] → actor #94 ?[keyDown,★] → actor #94 assert( [keyDown,space] )

slide-21
SLIDE 21

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [keyDown,space] → actor #42 [sprite,player,51,100, ] → actor #94 ?[keyDown,★] → actor #94

slide-22
SLIDE 22

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [keyDown,space] → actor #42 [sprite,player,51,100, ] → actor #94 ?[keyDown,★] → actor #94 retract( [keyDown,space] )

slide-23
SLIDE 23

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [keyDown,space] actor #42 [sprite,player,51,100, ] → actor #94 ?[keyDown,★] → actor #94 retract( [keyDown,space] )

slide-24
SLIDE 24

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [sprite,player,51,100, ] → actor #94 ?[keyDown,★] → actor #94

slide-25
SLIDE 25

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [sprite,player,51,100, ] → actor #94 ?[keyDown,★] → actor #94 retract( [keyDown,space] )

slide-26
SLIDE 26

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [sprite,player,51,100, ] → actor #94 ?[keyDown,★] → actor #94

slide-27
SLIDE 27

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [sprite,player,51,100, ] → actor #94 ?[keyDown,★] → actor #94

slide-28
SLIDE 28

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [sprite,player,51,100, ] → actor #94 ?[keyDown,★] → actor #94

slide-29
SLIDE 29

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [sprite,player,51,100, ] → actor #94 ?[keyDown,★] → actor #94

slide-30
SLIDE 30

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [sprite,player,51,100, ] → actor #94 ?[keyDown,★] → actor #94

slide-31
SLIDE 31

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [sprite,player,51,100, ] → actor #94 ?[keyDown,★] → actor #94 ← x

slide-32
SLIDE 32

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [sprite,player,51,100, ] → actor #94 ?[keyDown,★] → actor #94 ← x

← ⇃x

slide-33
SLIDE 33

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [sprite,player,51,100, ] → actor #94 ?[keyDown,★] → actor #94 ← x

← ⇃x ← ⇃⇃x

slide-34
SLIDE 34

event × state → [action] × state

actor #17 actor #42 actor #94

[currentScore,3] → actor #17 [sprite,player,51,100, ] → actor #94 ?[keyDown,★] → actor #94 ← x

← ⇃x ← ⇃⇃x ← ⇃⇃⇃x

slide-35
SLIDE 35

Messages are transient assertions < [incrementScoreBy,3] > ~ assert( [incrementScoreBy,3] ) followed by retract( [incrementScoreBy,3] )

(See “Coordinated Concurrent Programming in Syndicate” (ESOP 2016) for full detail of the semantics)

slide-36
SLIDE 36

Syndicate Implementations

Racket macros & support library #lang syndicate Ohm-based translation to ECMAScript 5 Browser & node

slide-37
SLIDE 37

Syndicate Implementations

Racket macros & support library #lang syndicate Ohm-based translation to ECMAScript 5 Browser & node

slide-38
SLIDE 38

Syndicate DSL by example

  • Mapping events to components
  • Managing conversational state
  • Monitoring changes in shared state
slide-39
SLIDE 39

Mapping events to components

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → game ?(controller-event 'left ★) → game ?(clock-tick) → game (sprite 5 'player) → game

slide-40
SLIDE 40

Mapping events to components

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → game ?(controller-event 'left ★) → game ?(clock-tick) → game (sprite 5 'player) → game Interest in START presses at next outer dataspace

slide-41
SLIDE 41

Mapping events to components

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → game ?(controller-event 'left ★) → game ?(clock-tick) → game (sprite 5 'player) → game Interest in LEFT presses/releases at next dataspace

slide-42
SLIDE 42

Mapping events to components

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → game ?(controller-event 'left ★) → game ?(clock-tick) → game (sprite 5 'player) → game Interest in clock ticks at next outer dataspace

slide-43
SLIDE 43

Mapping events to components

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → game ?(controller-event 'left ★) → game ?(clock-tick) → game (sprite 5 'player) → game Sprite published to next outer dataspace

slide-44
SLIDE 44

Mapping events to components

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → game ?(controller-event 'left ★) → game ?(clock-tick) → game (sprite 5 'player) → game Game-piece state published locally

slide-45
SLIDE 45

Mapping events to components

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → game ?(controller-event 'left ★) → game ?(clock-tick) → game (sprite 5 'player) → game Subscription to game-piece states

slide-46
SLIDE 46

Mapping events to components

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → game ?(controller-event 'left ★) → game ?(clock-tick) → game (sprite 5 'player) → game Interest in START presses at local dataspace

slide-47
SLIDE 47

Mapping events to components

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → game ?(controller-event 'left ★) → game ?(clock-tick) → game (sprite 5 'player) → game Interest in LEFT presses/releases at local dataspace

slide-48
SLIDE 48

Mapping events to components

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → game ?(controller-event 'left ★) → game ?(clock-tick) → game (sprite 5 'player) → game Interest in clock ticks at local dataspace

slide-49
SLIDE 49

Mapping events to components

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → game ?(controller-event 'left ★) → game ?(clock-tick) → game (sprite 5 'player) → game Assertion of sprite position at local dataspace

slide-50
SLIDE 50

Mapping events to components

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → game ?(controller-event 'left ★) → game ?(clock-tick) → game (sprite 5 'player) → game

slide-51
SLIDE 51

Mapping events to components

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → game ?(controller-event 'left ★) → game ?(clock-tick) → game (sprite 5 'player) → game

Pressing the START key should terminate the game

slide-52
SLIDE 52

Mapping events to components

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → game ?(controller-event 'left ★) → game ?(clock-tick) → game (sprite 5 'player) → game

< (controller-event 'start #t) >

slide-53
SLIDE 53

Mapping events to components

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → game ?(controller-event 'left ★) → game ?(clock-tick) → game (sprite 5 'player) → game

< (controller-event 'start #t) >

slide-54
SLIDE 54

Mapping events to components

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → game ?(controller-event 'left ★) → game ?(clock-tick) → game (sprite 5 'player) → game

< ⇃(controller-event 'start #t) >

slide-55
SLIDE 55

Mapping events to components

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → game ?(controller-event 'left ★) → game ?(clock-tick) → game (sprite 5 'player) → game

quit-dataspace!

slide-56
SLIDE 56

Mapping events to components

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → game ?(controller-event 'left ★) → game ?(clock-tick) → game (sprite 5 'player) → game

slide-57
SLIDE 57

Mapping events to components

controller driver ?(controller-event 'start #t) game ?(controller-event 'left ★) game ?(clock-tick) game (sprite 5 'player) game

slide-58
SLIDE 58

Mapping events to components

controller driver

slide-59
SLIDE 59

(spawn-dataspace (spawn-start-button-monitor) (spawn-player) (spawn-collision-detection) ...) (define (spawn-start-button-monitor) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'start #t))) (transition state (quit-dataspace))])) (void) (sub (controller-event 'start #t) #:meta-level 1) ))

slide-60
SLIDE 60

(spawn-dataspace (spawn-start-button-monitor) (spawn-player) (spawn-collision-detection) ...) (define (spawn-start-button-monitor) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'start #t))) (transition state (quit-dataspace))])) (void) (sub (controller-event 'start #t) #:meta-level 1) ))

slide-61
SLIDE 61

(spawn-dataspace (spawn-start-button-monitor) (spawn-player) (spawn-collision-detection) ...) (define (spawn-start-button-monitor) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'start #t))) (transition state (quit-dataspace))])) (void) (sub (controller-event 'start #t) #:meta-level 1) ))

slide-62
SLIDE 62

(spawn-dataspace (spawn-start-button-monitor) (spawn-player) (spawn-collision-detection) ...) (define (spawn-start-button-monitor) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'start #t))) (transition state (quit-dataspace))])) (void) (sub (controller-event 'start #t) #:meta-level 1) ))

slide-63
SLIDE 63

(spawn-dataspace (spawn-start-button-monitor) (spawn-player) (spawn-collision-detection) ...) (define (spawn-start-button-monitor) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'start #t))) (transition state (quit-dataspace))])) (void) (sub (controller-event 'start #t) #:meta-level 1) ))

slide-64
SLIDE 64

(spawn-dataspace (spawn-start-button-monitor) (spawn-player) (spawn-collision-detection) ...) (define (spawn-start-button-monitor) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'start #t))) (transition state (quit-dataspace))])) (void) (sub (controller-event 'start #t) #:meta-level 1) ))

slide-65
SLIDE 65

(spawn-dataspace (spawn-start-button-monitor) (spawn-player) (spawn-collision-detection) ...) (define (spawn-start-button-monitor) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'start #t))) (transition state (quit-dataspace))])) (void) (sub (controller-event 'start #t) #:meta-level 1) ))

slide-66
SLIDE 66

(spawn-dataspace (spawn-start-button-monitor) (spawn-player) (spawn-collision-detection) ...) (define (spawn-start-button-monitor) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'start #t))) (transition state (quit-dataspace))])) (void) (sub (controller-event 'start #t) #:meta-level 1) ))

slide-67
SLIDE 67

(spawn-dataspace (spawn-start-button-monitor) (spawn-player) (spawn-collision-detection) ...) (define (spawn-start-button-monitor) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'start #t))) (transition state (quit-dataspace))])) (void) (sub (controller-event 'start #t) #:meta-level 1) ))

slide-68
SLIDE 68

(spawn-dataspace (spawn-start-button-monitor) (spawn-player) (spawn-collision-detection) ...) (define (spawn-start-button-monitor) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'start #t))) (transition state (quit-dataspace))])) (void) (sub (controller-event 'start #t) #:meta-level 1) ))

Dataspace lifetime not syntactically apparent

slide-69
SLIDE 69

(spawn-dataspace (spawn-start-button-monitor) (spawn-player) (spawn-collision-detection) ...) (define (spawn-start-button-monitor) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'start #t))) (transition state (quit-dataspace))])) (void) (sub (controller-event 'start #t) #:meta-level 1) ))

slide-70
SLIDE 70

(spawn-dataspace (spawn-start-button-monitor) (spawn-player) (spawn-collision-detection) ...) (define (spawn-start-button-monitor) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'start #t))) (transition state (quit-dataspace))])) (void) (sub (controller-event 'start #t) #:meta-level 1) ))

2× repetition of pattern

slide-71
SLIDE 71

(spawn-dataspace (spawn-start-button-monitor) (spawn-player) (spawn-collision-detection) ...) (define (spawn-start-button-monitor) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'start #t))) (transition state (quit-dataspace))])) (void) (sub (controller-event 'start #t) #:meta-level 1) ))

slide-72
SLIDE 72

(spawn-dataspace (spawn-start-button-monitor) (spawn-player) (spawn-collision-detection) ...) (define (spawn-start-button-monitor) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'start #t))) (transition state (quit-dataspace))])) (void) (sub (controller-event 'start #t) #:meta-level 1) ))

2× repetition of metalevel, in two styles

slide-73
SLIDE 73

(dataspace (spawn-player) (spawn-collision-detection) ... (until (message (controller-event 'start #t) #:meta-level 1)))

slide-74
SLIDE 74

(dataspace (spawn-player) (spawn-collision-detection) ... (until (message (controller-event 'start #t) #:meta-level 1))) dataspace termination near dataspace startup

slide-75
SLIDE 75

(dataspace (spawn-player) (spawn-collision-detection) ... (until (message (controller-event 'start #t) #:meta-level 1))) subscription/message pattern written once

slide-76
SLIDE 76

(dataspace (spawn-player) (spawn-collision-detection) ... (until (message (controller-event 'start #t) #:meta-level 1))) metalevel number written once, in one style

slide-77
SLIDE 77

Syndicate DSL by example

✓ Mapping events to components

  • Managing conversational state
  • Monitoring changes in shared state
slide-78
SLIDE 78

Managing conversational state

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level

slide-79
SLIDE 79

Managing conversational state

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level

Three jobs: − watch state of left-arrow − listen to clock-tick while arrow pressed − maintain sprite & game-piece-state

slide-80
SLIDE 80

Managing conversational state

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level

< (controller-event 'left #t) >

slide-81
SLIDE 81

Managing conversational state

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level

< (controller-event 'left #t) >

slide-82
SLIDE 82

Managing conversational state

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level

< ⇃(controller-event 'left #t) >

slide-83
SLIDE 83

Managing conversational state

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level

assert( ⇃?(clock-tick) )

slide-84
SLIDE 84

Managing conversational state

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level

assert( ⇃?(clock-tick) )

slide-85
SLIDE 85

Managing conversational state

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level

assert( ?(clock-tick) )

slide-86
SLIDE 86

Managing conversational state

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) → level

assert( ?(clock-tick) )

slide-87
SLIDE 87

Managing conversational state

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) → level

slide-88
SLIDE 88

Managing conversational state

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) → level

< (controller-event 'left #f) >

slide-89
SLIDE 89

Managing conversational state

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) → level

< (controller-event 'left #f) >

slide-90
SLIDE 90

Managing conversational state

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) → level

< ⇃(controller-event 'left #f) >

slide-91
SLIDE 91

Managing conversational state

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) → level

retract( ⇃?(clock-tick) )

slide-92
SLIDE 92

Managing conversational state

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) → level

slide-93
SLIDE 93

Managing conversational state

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) → level

retract( ?(clock-tick) )

slide-94
SLIDE 94

Managing conversational state

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) level

slide-95
SLIDE 95

Managing conversational state

controller driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level

slide-96
SLIDE 96

(struct player-state (position left-down?)) (define (spawn-player) (define initial-pos 5) (define initial-state (player-state initial-pos #f)) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'left pressed?))) (transition (struct-copy player-state state [left-down? pressed?]) '())] [(message (at-meta (clock-tick))) (define new-state (if (player-state-left-down? state) (struct-copy player-state state [position (- (player-state-position state) 1)]) state)) (define new-pos (player-state-position new-state)) (transition new-state (patch-seq (retract (sprite ? ?) #:meta-level 1) (assert (sprite new-pos 'player) #:meta-level 1) (retract (game-piece-state ? ?)) (assert (game-piece-state 'player new-pos))) )] initial-state (patch-seq (sub (controller-event 'left ?) #:meta-level 1) (sub (clock-tick) #:meta-level 1) (assert (sprite initial-pos 'player) #:meta-level 1) (assert (game-piece-state 'player initial-pos)))))

slide-97
SLIDE 97

(struct player-state (position left-down?)) (define (spawn-player) (define initial-pos 5) (define initial-state (player-state initial-pos #f)) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'left pressed?))) (transition (struct-copy player-state state [left-down? pressed?]) '())] [(message (at-meta (clock-tick))) (define new-state (if (player-state-left-down? state) (struct-copy player-state state [position (- (player-state-position state) 1)]) state)) (define new-pos (player-state-position new-state)) (transition new-state (patch-seq (retract (sprite ? ?) #:meta-level 1) (assert (sprite new-pos 'player) #:meta-level 1) (retract (game-piece-state ? ?)) (assert (game-piece-state 'player new-pos))) )] initial-state (patch-seq (sub (controller-event 'left ?) #:meta-level 1) (sub (clock-tick) #:meta-level 1) (assert (sprite initial-pos 'player) #:meta-level 1) (assert (game-piece-state 'player initial-pos)))))

slide-98
SLIDE 98

(struct player-state (position left-down?)) (define (spawn-player) (define initial-pos 5) (define initial-state (player-state initial-pos #f)) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'left pressed?))) (transition (struct-copy player-state state [left-down? pressed?]) '())] [(message (at-meta (clock-tick))) (define new-state (if (player-state-left-down? state) (struct-copy player-state state [position (- (player-state-position state) 1)]) state)) (define new-pos (player-state-position new-state)) (transition new-state (patch-seq (retract (sprite ? ?) #:meta-level 1) (assert (sprite new-pos 'player) #:meta-level 1) (retract (game-piece-state ? ?)) (assert (game-piece-state 'player new-pos))) )] initial-state (patch-seq (sub (controller-event 'left ?) #:meta-level 1) (sub (clock-tick) #:meta-level 1) (assert (sprite initial-pos 'player) #:meta-level 1) (assert (game-piece-state 'player initial-pos)))))

slide-99
SLIDE 99

(struct player-state (position left-down?)) (define (spawn-player) (define initial-pos 5) (define initial-state (player-state initial-pos #f)) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'left pressed?))) (transition (struct-copy player-state state [left-down? pressed?]) '())] [(message (at-meta (clock-tick))) (define new-state (if (player-state-left-down? state) (struct-copy player-state state [position (- (player-state-position state) 1)]) state)) (define new-pos (player-state-position new-state)) (transition new-state (patch-seq (retract (sprite ? ?) #:meta-level 1) (assert (sprite new-pos 'player) #:meta-level 1) (retract (game-piece-state ? ?)) (assert (game-piece-state 'player new-pos))) )] initial-state (patch-seq (sub (controller-event 'left ?) #:meta-level 1) (sub (clock-tick) #:meta-level 1) (assert (sprite initial-pos 'player) #:meta-level 1) (assert (game-piece-state 'player initial-pos)))))

slide-100
SLIDE 100

(struct player-state (position left-down?)) (define (spawn-player) (define initial-pos 5) (define initial-state (player-state initial-pos #f)) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'left pressed?))) (transition (struct-copy player-state state [left-down? pressed?]) '())] [(message (at-meta (clock-tick))) (define new-state (if (player-state-left-down? state) (struct-copy player-state state [position (- (player-state-position state) 1)]) state)) (define new-pos (player-state-position new-state)) (transition new-state (patch-seq (retract (sprite ? ?) #:meta-level 1) (assert (sprite new-pos 'player) #:meta-level 1) (retract (game-piece-state ? ?)) (assert (game-piece-state 'player new-pos))) )] initial-state (patch-seq (sub (controller-event 'left ?) #:meta-level 1) (sub (clock-tick) #:meta-level 1) (assert (sprite initial-pos 'player) #:meta-level 1) (assert (game-piece-state 'player initial-pos)))))

slide-101
SLIDE 101

(struct player-state (position left-down?)) (define (spawn-player) (define initial-pos 5) (define initial-state (player-state initial-pos #f)) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'left pressed?))) (transition (struct-copy player-state state [left-down? pressed?]) '())] [(message (at-meta (clock-tick))) (define new-state (if (player-state-left-down? state) (struct-copy player-state state [position (- (player-state-position state) 1)]) state)) (define new-pos (player-state-position new-state)) (transition new-state (patch-seq (retract (sprite ? ?) #:meta-level 1) (assert (sprite new-pos 'player) #:meta-level 1) (retract (game-piece-state ? ?)) (assert (game-piece-state 'player new-pos))) )] initial-state (patch-seq (sub (controller-event 'left ?) #:meta-level 1) (sub (clock-tick) #:meta-level 1) (assert (sprite initial-pos 'player) #:meta-level 1) (assert (game-piece-state 'player initial-pos)))))

slide-102
SLIDE 102

(struct player-state (position left-down?)) (define (spawn-player) (define initial-pos 5) (define initial-state (player-state initial-pos #f)) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'left pressed?))) (transition (struct-copy player-state state [left-down? pressed?]) '())] [(message (at-meta (clock-tick))) (define new-state (if (player-state-left-down? state) (struct-copy player-state state [position (- (player-state-position state) 1)]) state)) (define new-pos (player-state-position new-state)) (transition new-state (patch-seq (retract (sprite ? ?) #:meta-level 1) (assert (sprite new-pos 'player) #:meta-level 1) (retract (game-piece-state ? ?)) (assert (game-piece-state 'player new-pos))) )] initial-state (patch-seq (sub (controller-event 'left ?) #:meta-level 1) (sub (clock-tick) #:meta-level 1) (assert (sprite initial-pos 'player) #:meta-level 1) (assert (game-piece-state 'player initial-pos)))))

slide-103
SLIDE 103

(struct player-state (position left-down?)) (define (spawn-player) (define initial-pos 5) (define initial-state (player-state initial-pos #f)) (spawn (lambda (evt state) (match-event evt [(message (at-meta (controller-event 'left pressed?))) (transition (struct-copy player-state state [left-down? pressed?]) '())] [(message (at-meta (clock-tick))) (define new-state (if (player-state-left-down? state) (struct-copy player-state state [position (- (player-state-position state) 1)]) state)) (define new-pos (player-state-position new-state)) (transition new-state (patch-seq (retract (sprite ? ?) #:meta-level 1) (assert (sprite new-pos 'player) #:meta-level 1) (retract (game-piece-state ? ?)) (assert (game-piece-state 'player new-pos))) )] initial-state (patch-seq (sub (controller-event 'left ?) #:meta-level 1) (sub (clock-tick) #:meta-level 1) (assert (sprite initial-pos 'player) #:meta-level 1) (assert (game-piece-state 'player initial-pos)))))

slide-104
SLIDE 104

(define (spawn-player) (define move-left (gensym)) (actor (forever #:collect [(position 5)] (assert (sprite position 'player) #:meta-level 1) (assert (game-piece-state 'player position)) (on (message (controller-event 'left #t) #:meta-level 1) (until (message (controller-event 'left #f) #:meta-level 1) (on (message (clock-tick) #:meta-level 1) (send! move-left)))) (on (message move-left) (- position 1)) )))

slide-105
SLIDE 105

(define (spawn-player) (define move-left (gensym)) (actor (forever #:collect [(position 5)] (assert (sprite position 'player) #:meta-level 1) (assert (game-piece-state 'player position)) (on (message (controller-event 'left #t) #:meta-level 1) (until (message (controller-event 'left #f) #:meta-level 1) (on (message (clock-tick) #:meta-level 1) (send! move-left)))) (on (message move-left) (- position 1)) )))

slide-106
SLIDE 106

(define (spawn-player) (define move-left (gensym)) (actor (forever #:collect [(position 5)] (assert (sprite position 'player) #:meta-level 1) (assert (game-piece-state 'player position)) (on (message (controller-event 'left #t) #:meta-level 1) (until (message (controller-event 'left #f) #:meta-level 1) (on (message (clock-tick) #:meta-level 1) (send! move-left)))) (on (message move-left) (- position 1)) )))

slide-107
SLIDE 107

(define (spawn-player) (define move-left (gensym)) (actor (forever #:collect [(position 5)] (assert (sprite position 'player) #:meta-level 1) (assert (game-piece-state 'player position)) (on (message (controller-event 'left #t) #:meta-level 1) (until (message (controller-event 'left #f) #:meta-level 1) (on (message (clock-tick) #:meta-level 1) (send! move-left)))) (on (message move-left) (- position 1)) ))) Substate continues to apply until termination event triggered

slide-108
SLIDE 108

(define (spawn-player) (define move-left (gensym)) (actor (forever #:collect [(position 5)] (assert (sprite position 'player) #:meta-level 1) (assert (game-piece-state 'player position)) (on (message (controller-event 'left #t) #:meta-level 1) (until (message (controller-event 'left #f) #:meta-level 1) (on (message (clock-tick) #:meta-level 1) (send! move-left)))) (on (message move-left) (- position 1)) ))) Substate continues to apply until termination event triggered

slide-109
SLIDE 109

(define (spawn-player) (define move-left (gensym)) (actor (forever #:collect [(position 5)] (assert (sprite position 'player) #:meta-level 1) (assert (game-piece-state 'player position)) (on (message (controller-event 'left #t) #:meta-level 1) (until (message (controller-event 'left #f) #:meta-level 1) (on (message (clock-tick) #:meta-level 1) (send! move-left)))) (on (message move-left) (- position 1)) ))) Substate continues to apply until termination event triggered

slide-110
SLIDE 110

(define (spawn-player) (define move-left (gensym)) (actor (forever #:collect [(position 5)] (assert (sprite position 'player) #:meta-level 1) (assert (game-piece-state 'player position)) (on (message (controller-event 'left #t) #:meta-level 1) (until (message (controller-event 'left #f) #:meta-level 1) (on (message (clock-tick) #:meta-level 1) (send! move-left)))) (on (message move-left) (- position 1)) ))) Substate continues to apply until termination event triggered

slide-111
SLIDE 111

(define (spawn-player) (define move-left (gensym)) (actor (forever #:collect [(position 5)] (assert (sprite position 'player) #:meta-level 1) (assert (game-piece-state 'player position)) (on (message (controller-event 'left #t) #:meta-level 1) (until (message (controller-event 'left #f) #:meta-level 1) (on (message (clock-tick) #:meta-level 1) (send! move-left)))) (on (message move-left) (- position 1)) )))

slide-112
SLIDE 112

(define (spawn-player) (define move-left (gensym)) (actor (forever #:collect [(position 5)] (assert (sprite position 'player) #:meta-level 1) (assert (game-piece-state 'player position)) (on (message (controller-event 'left #t) #:meta-level 1) (until (message (controller-event 'left #f) #:meta-level 1) (on (message (clock-tick) #:meta-level 1) (send! move-left)))) (on (message move-left) (- position 1)) )))

slide-113
SLIDE 113

(define (spawn-player) (define position 5) (actor (forever (assert (sprite position 'player) #:meta-level 1) (assert (game-piece-state 'player position)) (on (message (controller-event 'left #t) #:meta-level 1) (until (message (controller-event 'left #f) #:meta-level 1) (on (message (clock-tick) #:meta-level 1) (set! position (- position 1))))))))

slide-114
SLIDE 114

(define (spawn-player) (define position 5) (actor (forever (assert (sprite position 'player) #:meta-level 1) (assert (game-piece-state 'player position)) (on (message (controller-event 'left #t) #:meta-level 1) (until (message (controller-event 'left #f) #:meta-level 1) (on (message (clock-tick) #:meta-level 1) (set! position (- position 1))))))))

slide-115
SLIDE 115

Syndicate DSL by example

✓ Mapping events to components ✓ Managing conversational state

  • Monitoring changes in shared state
slide-116
SLIDE 116

Monitoring changes in shared state

clock driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) → level

slide-117
SLIDE 117

Monitoring changes in shared state

clock driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) → level

Must maintain an index over game-piece-state records asserted by other actors

slide-118
SLIDE 118

Monitoring changes in shared state

clock driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) → level

< (clock-tick) >

slide-119
SLIDE 119

Monitoring changes in shared state

clock driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) → level

< (clock-tick) >

slide-120
SLIDE 120

Monitoring changes in shared state

clock driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) → level

< ⇃(clock-tick) >

slide-121
SLIDE 121

Monitoring changes in shared state

clock driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 5 'player) → player (game-piece-state 'player 5) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) → level

retract( (sprite ★ ★) ), assert( (sprite 4 'player) ), retract( (game-piece-state ★ ★) ), assert( (game-piece-state 'player 4) )

slide-122
SLIDE 122

Monitoring changes in shared state

clock driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 4 'player) → player (game-piece-state 'player 4) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) → level

retract( (sprite ★ ★) ), assert( (sprite 4 'player) ), retract( (game-piece-state ★ ★) ), assert( (game-piece-state 'player 4) )

slide-123
SLIDE 123

Monitoring changes in shared state

clock driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 4 'player) → player (game-piece-state 'player 4) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) → level

retract( (sprite 5 'player) ) assert( (sprite 4 'player) )

slide-124
SLIDE 124

Monitoring changes in shared state

clock driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 4 'player) → player (game-piece-state 'player 4) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) → level

retract( (game-piece-state 'player 5) ), assert( (game-piece-state 'player 4) )

slide-125
SLIDE 125

Monitoring changes in shared state

clock driver “start” checker player collision detector

...

⇃?(controller-event 'start #t) → “start” checker ⇃?(controller-event 'left ★) → player ⇃?(clock-tick) → player ⇃(sprite 4 'player) → player (game-piece-state 'player 4) → player ?(game-piece-state ★ ★) → collision detector ↑game ?(controller-event 'start #t) → level ?(controller-event 'left ★) → level ?(clock-tick) → level

slide-126
SLIDE 126

(struct collision-detection-state (pieces)) (define (spawn-collision-detection) (spawn (lambda (evt state) (match-event evt [(? patch? p) (define p0 (collision-detection-state-pieces state)) (define p1 (for-trie/fold [(pieces p0)] [((game-piece-state $id _) (patch-removed p))] (hash-remove pieces id))) (define p2 (for-trie/fold [(pieces p1)] [(($ piece (game-piece-state _ _)) (patch-added p))] (hash-set pieces (game-piece-state-id piece) piece))) (transition (struct-copy collision-detection-state state [pieces p2]) '())])) (collision-detection-state (hash)) (sub (game-piece-state ? ?))))

slide-127
SLIDE 127

(struct collision-detection-state (pieces)) (define (spawn-collision-detection) (spawn (lambda (evt state) (match-event evt [(? patch? p) (define p0 (collision-detection-state-pieces state)) (define p1 (for-trie/fold [(pieces p0)] [((game-piece-state $id _) (patch-removed p))] (hash-remove pieces id))) (define p2 (for-trie/fold [(pieces p1)] [(($ piece (game-piece-state _ _)) (patch-added p))] (hash-set pieces (game-piece-state-id piece) piece))) (transition (struct-copy collision-detection-state state [pieces p2]) '())])) (collision-detection-state (hash)) (sub (game-piece-state ? ?))))

slide-128
SLIDE 128

(struct collision-detection-state (pieces)) (define (spawn-collision-detection) (spawn (lambda (evt state) (match-event evt [(? patch? p) (define p0 (collision-detection-state-pieces state)) (define p1 (for-trie/fold [(pieces p0)] [((game-piece-state $id _) (patch-removed p))] (hash-remove pieces id))) (define p2 (for-trie/fold [(pieces p1)] [(($ piece (game-piece-state _ _)) (patch-added p))] (hash-set pieces (game-piece-state-id piece) piece))) (transition (struct-copy collision-detection-state state [pieces p2]) '())])) (collision-detection-state (hash)) (sub (game-piece-state ? ?))))

slide-129
SLIDE 129

(struct collision-detection-state (pieces)) (define (spawn-collision-detection) (spawn (lambda (evt state) (match-event evt [(? patch? p) (define p0 (collision-detection-state-pieces state)) (define p1 (for-trie/fold [(pieces p0)] [((game-piece-state $id _) (patch-removed p))] (hash-remove pieces id))) (define p2 (for-trie/fold [(pieces p1)] [(($ piece (game-piece-state _ _)) (patch-added p))] (hash-set pieces (game-piece-state-id piece) piece))) (transition (struct-copy collision-detection-state state [pieces p2]) '())])) (collision-detection-state (hash)) (sub (game-piece-state ? ?))))

Patch events describe whole sets

  • f added and removed assertions,

but programmers think about single assertions.

slide-130
SLIDE 130

(struct collision-detection-state (pieces)) (define (spawn-collision-detection) (spawn (lambda (evt state) (match-event evt [(? patch? p) (define p0 (collision-detection-state-pieces state)) (define p1 (for-trie/fold [(pieces p0)] [((game-piece-state $id _) (patch-removed p))] (hash-remove pieces id))) (define p2 (for-trie/fold [(pieces p1)] [(($ piece (game-piece-state _ _)) (patch-added p))] (hash-set pieces (game-piece-state-id piece) piece))) (transition (struct-copy collision-detection-state state [pieces p2]) '())])) (collision-detection-state (hash)) (sub (game-piece-state ? ?))))

slide-131
SLIDE 131

(struct collision-detection-state (pieces)) (define (spawn-collision-detection) (spawn (lambda (evt state) (match-event evt [(? patch? p) (define p0 (collision-detection-state-pieces state)) (define p1 (for-trie/fold [(pieces p0)] [((game-piece-state $id _) (patch-removed p))] (hash-remove pieces id))) (define p2 (for-trie/fold [(pieces p1)] [(($ piece (game-piece-state _ _)) (patch-added p))] (hash-set pieces (game-piece-state-id piece) piece))) (transition (struct-copy collision-detection-state state [pieces p2]) '())])) (collision-detection-state (hash)) (sub (game-piece-state ? ?))))

slide-132
SLIDE 132

(struct collision-detection-state (pieces)) (define (spawn-collision-detection) (spawn (lambda (evt state) (match-event evt [(? patch? p) (define p0 (collision-detection-state-pieces state)) (define p1 (for-trie/fold [(pieces p0)] [((game-piece-state $id _) (patch-removed p))] (hash-remove pieces id))) (define p2 (for-trie/fold [(pieces p1)] [(($ piece (game-piece-state _ _)) (patch-added p))] (hash-set pieces (game-piece-state-id piece) piece))) (transition (struct-copy collision-detection-state state [pieces p2]) '())])) (collision-detection-state (hash)) (sub (game-piece-state ? ?))))

slide-133
SLIDE 133

(struct collision-detection-state (pieces)) (define (spawn-collision-detection) (spawn (lambda (evt state) (match-event evt [(? patch? p) (define p0 (collision-detection-state-pieces state)) (define p1 (for-trie/fold [(pieces p0)] [((game-piece-state $id _) (patch-removed p))] (hash-remove pieces id))) (define p2 (for-trie/fold [(pieces p1)] [(($ piece (game-piece-state _ _)) (patch-added p))] (hash-set pieces (game-piece-state-id piece) piece))) (transition (struct-copy collision-detection-state state [pieces p2]) '())])) (collision-detection-state (hash)) (sub (game-piece-state ? ?))))

slide-134
SLIDE 134

(struct collision-detection-state (pieces)) (define (spawn-collision-detection) (spawn (lambda (evt state) (match-event evt [(? patch? p) (define p0 (collision-detection-state-pieces state)) (define p1 (for-trie/fold [(pieces p0)] [((game-piece-state $id _) (patch-removed p))] (hash-remove pieces id))) (define p2 (for-trie/fold [(pieces p1)] [(($ piece (game-piece-state _ _)) (patch-added p))] (hash-set pieces (game-piece-state-id piece) piece))) (transition (struct-copy collision-detection-state state [pieces p2]) '())])) (collision-detection-state (hash)) (sub (game-piece-state ? ?))))

slide-135
SLIDE 135

3× repetition of pattern

(struct collision-detection-state (pieces)) (define (spawn-collision-detection) (spawn (lambda (evt state) (match-event evt [(? patch? p) (define p0 (collision-detection-state-pieces state)) (define p1 (for-trie/fold [(pieces p0)] [((game-piece-state $id _) (patch-removed p))] (hash-remove pieces id))) (define p2 (for-trie/fold [(pieces p1)] [(($ piece (game-piece-state _ _)) (patch-added p))] (hash-set pieces (game-piece-state-id piece) piece))) (transition (struct-copy collision-detection-state state [pieces p2]) '())])) (collision-detection-state (hash)) (sub (game-piece-state ? ?))))

slide-136
SLIDE 136

(define (spawn-collision-detection) (actor (forever #:collect [(pieces (hash))] (on (retracted (game-piece-state $id _)) (hash-remove pieces id)) (on (asserted ($ piece (game-piece-state _ _))) (hash-set pieces (game-piece-state-id piece) piece)))))

slide-137
SLIDE 137

(define (spawn-collision-detection) (actor (forever #:collect [(pieces (hash))] (on (retracted (game-piece-state $id _)) (hash-remove pieces id)) (on (asserted ($ piece (game-piece-state _ _))) (hash-set pieces (game-piece-state-id piece) piece)))))

slide-138
SLIDE 138

(define (spawn-collision-detection) (actor (forever #:collect [(pieces (hash))] (on (retracted (game-piece-state $id _)) (hash-remove pieces id)) (on (asserted ($ piece (game-piece-state _ _))) (hash-set pieces (game-piece-state-id piece) piece)))))

slide-139
SLIDE 139

(define (spawn-collision-detection) (actor (forever #:collect [(pieces (hash))] (on (retracted (game-piece-state $id _)) (hash-remove pieces id)) (on (asserted ($ piece (game-piece-state _ _))) (hash-set pieces (game-piece-state-id piece) piece)))))

slide-140
SLIDE 140

(define (spawn-collision-detection) (actor (forever #:collect [(pieces (hash))] (on (retracted (game-piece-state $id _)) (hash-remove pieces id)) (on (asserted ($ piece (game-piece-state _ _))) (hash-set pieces (game-piece-state-id piece) piece))))) (actor (forever (query [pieces (hash id piece) ; “group-by” ($ piece (game-piece-state $id _))]) (on (changed pieces) ...)))

slide-141
SLIDE 141

Syndicate DSL by example

✓ Mapping events to components ✓ Managing conversational state ✓ Monitoring changes in shared state

slide-142
SLIDE 142

Status

Strong space savings in most places

slide-143
SLIDE 143

syn·di·cate

a language for interactive programs

Progress Report on DSL Design

Repeated idioms ⟶ Language features

Future work: − Improved state sharing with substates − “Queries” (e.g. “group-by”) − Non-naive compilation strategy − Better technique for naming metalevels − More evaluations & case studies

http://syndicate-lang.org/