Esterel in Racket

Synchronous Reactive Programming

What is Esterel?

Esterel Esterel on Wikipedia is a synchronous reactive programming language developed in France in the 80s. In Esterel, operations are executed in parallel threads with specific synchronous timing.

There are a few implementations of Esterel or Esterel-like languages such as HipHop.js . Here, I'm using and adding onto the Racket implementation of Esterel Esterel in Racket .

Writing Esterel in Racket is be done using:

#lang racket

(require esterel/full)

(esterel
    ...)

In Esterel, signals are "variables"; they are emited by Esterel programs define-signal defines signals globally while with-signal allows you to locally define signals. .

#lang racket

(require esterel/full)

(define-signal red)

(define forever-red
    (esterel
        (sustain red)))

Running this code doesn't visibly do anything. You need to react! to "ask" Esterel if there are any signals emitted.

> (react! forever-red)
'#hash((#<signal: red> . #t))

To control the timing of when Esterel signals are emitted, pause is used.

#lang racket

(require esterel/full)

(define-signal red)

(define forever-red
    (esterel
        (pause)
        (sustain red)))
> (react! forever-red)
'#hash()
> (react! forever-red)
'#hash((#<signal: red> . #t))

Since forever-red is paused on the first step, there is no signal emitted. react!ing again walks to the next step and causes red to be sustained.

To run multiple threads in parallel, use par:

#lang racket

(require esterel/full)

(define-signal red)

(define forever-red
    (esterel
        (par
            (sustain red)
            (sustain green))))
> (react! forever-red)
'#hash((#<signal: green> . #t) (#<signal: red> . #t))