1 Primitives
undefined
undefined?
behavior?
event?
signal?
seconds
milliseconds
never-e
2 Defining Custom Input Signals
new-cell
set-cell!
event-receiver
send-event
3 Signal-Processing Procedures
value-now
delay-by
integral
derivative
map-e
==>
filter-e
=#>
merge-e
once-e
changes
hold
switch
accum-e
accum-b
collect-e
collect-b
when-e
lift-strict
4 Fred: Functional Reactive Wrapper around Mr Ed
ft-frame%
ft-message%
ft-button%
get-value-e
ft-check-box%
get-value-b
ft-slider%
get-value-b
ft-text-field%
get-value-b
ft-radio-box%
get-selection-b
ft-choice%
get-selection-b
ft-list-box%
get-selection-b
get-selections-b
5 Graphical Demo Programs
Version: 3.99.0.25

 

FrTime: A Language for Reactive Programs

The frtime.ss language supports declarative construction of reactive systems in a syntax very similar to that of MzScheme. To interact with FrTime, select FrTime from the "Choose Language" menu. You can also make FrTime the language for a module:

  (module <module-name> frtime

     <module-body>)

 #lang frtime

1 Primitives

undefined : any/c

stands for an undefined value.

(undefined? val)  boolean?

  val : any/c

return #t iff val is undefined.

(behavior? val)  boolean?

  val : any/c

returns #t iff val is a behavior (a time-varying value whose current value can be projected at any time).

(event? val)  boolean?

  val : any/c

returns #t iff val is an event (a time-varying stream of values that can occur at arbitrary times).

(signal? val)  boolean?

  val : any/c

returns #t iff val is a signal. (signal? v) is equivalent to (or (behavior? v) (event? v)).

seconds : behavior?

updates approximately once per second with the value of (current-seconds).

milliseconds : behavior?

updates frequently with the value of (current-inexact-milliseconds).

never-e : event?

is an event that never occurs.

2 Defining Custom Input Signals

(new-cell [init-expr])  signal?

  init-expr : signal? = undefined

returns a signal whose values initially track that of init-expr, but that may be rewired to a different signal by set-cell!.

(set-cell! cell val)  void?

  cell : signal?

  val : signal?

rewires cell (which must have been created by new-cell) to take on the value(s) of val.

(event-receiver)  event?

returns an event stream that can be triggered imperatively by send-event.

(send-event rcvr val)  void?

  rcvr : event?

  val : any/c

emits val on rcvr (which must have been created by event-receiver).

3 Signal-Processing Procedures

(value-now val)  any/c

  val : any/c

projects the current value of a behavior or constant.

(delay-by val duration)  behavior?

  val : behavior?

  duration : number?

delays val by duration milliseconds.

(integral val)  behavior?

  val : (or/c number? behavior?)

computes a numeric approximation of the integral of val with respect to time (measured in milliseconds).

(derivative val)  behavior?

  val : behavior?

computes a numeric approximation of the derivative of val with respect to time.

(map-e proc ev)  event?

  proc : (-> any/c any)

  ev : event?

(==> ev proc)  event?

  ev : event?

  proc : (-> any/c any)

returns an event stream that fires whenever ev fires, whose values are transformed by application of proc.

(filter-e pred ev)  event?

  pred : (-> any/c boolean?)

  ev : event?

(=#> ev pred)  event?

  ev : event?

  pred : (-> any/c boolean?)

returns an event stream that passes through only the values from ev for which pred returns #t.

(merge-e ev ...)  event?

  ev : event?

merges all of the input event sources into a single event source.

(once-e ev)  event?

  ev : event?

returns an event source that carries only the first occurrence of ev. (The rest are filtered out.)

(changes val)  event?

  val : behavior?

returns an event source that occurs each time the argument behavior changes. The value of the occurrence is the behavior’s new value.

(hold ev [init])  behavior?

  ev : event?

  init : any/c = undefined

constructs a behavior that starts out as init and then takes on the last value produced by ev

(switch ev [init])  behavior?

  ev : event?

  init : behavior? = undefined

returns a behavior that starts as init. Each time ev yields a (potentially time-varying) value, the behavior switches to that value.

(accum-e ev init)  event?

  ev : event?

  init : any/c

constructs an event source by accumulating changes (carried by the given event source) over an initial value.

(accum-b ev init)  behavior?

  ev : event?

  init : any/c

combines functionality from accum-e and hold to construct a behavior. (accum-b ev init) is equivalent to (hold init (accum-e ev init)).

(collect-e ev init proc)  event?

  ev : event?

  init : any/c

  

proc

 

:

 

(-> any/c any/c

any)

is similar to accum-e, except the transformer function is fixed and is applied to the event occurrence and the current accumulator (in that order).

(collect-b ev init proc)  behavior?

  ev : event?

  init : any/c

  proc : (-> any/c any/c any)

is similar to collect-e in the same way as accum-b is similar to accum-e.

(when-e val)  event?

  val : behavior?

returns an event stream that carries an occurrence each time val changes from #f to anything else.

(lift-strict proc val ...)  any

  proc : (-> [arg any/c] ... any)

  val : any/c

provides a mechanism for applying ordinary Scheme primitives to behaviors. If any of the vals are behaviors, returns a behavior whose current value is always equal to (proc (value-now arg) ...). In FrTime, many MzScheme primitives are implicitly lifted.

The following forms allow importation of lifted procedures that aren’t included in the basic FrTime language.

  (require (lifted module-spec proc-name ...) ...)

  (require (lifted:nonstrict module-spec proc-name ...) ...)

4 Fred: Functional Reactive Wrapper around MrEd

 (require frtime/gui/fred)

ft-frame% : class?

  superclass: frame%

  extends: 

top-level-window<%>

(new ft-frame%

 

[label label]

 

 

 [

[parent parent]

 

 

 

[width width]

 

 

 

[height height]

 

 

 

[x x]

 

 

 

[y y]

 

 

 

[style style]

 

 

 

[enabled enabled]

 

 

 

[border border]

 

 

 

[spacing spacing]

 

 

 

[alignment alignment]

 

 

 

[min-width min-width]

 

 

 

[min-height min-height]

 

 

 

[stretchable-width stretchable-width]

 

 

 

[stretchable-height stretchable-height]

 

 

 

[shown shown]])

 

  (is-a?/c ft-frame%)

  label : (or/c label-string? behavior?)

  parent : (or/c (is-a?/c frame%) false/c) = #f

  width : (or/c (integer-in 0 10000) false/c) = #f

  height : (or/c (integer-in 0 10000) false/c) = #f

  x : (or/c (integer-in -10000 10000) false/c) = #f

  y : (or/c (integer-in -10000 10000) false/c) = #f

  

style

 

:

 

(listof (one-of/c 'no-resize-border 'no-caption

                  'no-system-menu 'hide-menu-bar

                  'mdi-parent 'mdi-child

                  'toolbar-button 'float 'metal))

 

 

 

=

 

null

  enabled : any/c = #t

  border : (integer-in 0 1000) = 0

  spacing : (integer-in 0 1000) = 0

  

alignment

 

:

 

(list/c (one-of/c 'left 'center 'right)

        (one-of/c 'top 'center 'bottom))

 

 

 

=

 

'(center top)

  min-width : (integer-in 0 10000) = graphical-minimum-width

  min-height : (integer-in 0 10000) = graphical-minimum-height

  stretchable-width : any/c = #t

  stretchable-height : any/c = #t

  shown : any/c = #f

The constructor arguments are as in frame%, except that shown label, enabled, stretchable-width, and stretchable-height may be time-varying.

ft-message% : class?

  superclass: message%

  extends: 

control<%>

(new ft-message%

 

[label label]

 

 

 

[parent parent]

 

 

 [

[style style]

 

 

 

[font font]

 

 

 

[enabled enabled]

 

 

 

[vert-margin vert-margin]

 

 

 

[horiz-margin horiz-margin]

 

 

 

[min-width min-width]

 

 

 

[min-height min-height]

 

 

 

[stretchable-width stretchable-width]

 

 

 

[stretchable-height stretchable-height]])

 

  (is-a?/c ft-message%)

  

label

 

:

 

(or/c label-string? behavior? (is-a?/c bitmap%)

      (or-of/c 'app 'caution 'stop))

  

parent

 

:

 

(or/c (is-a?/c frame%) (is-a?/c dialog%)

      (is-a?/c panel%) (is-a?/c pane%))

  style : (listof (one-of/c 'deleted)) = null

  font : (is-a?/c font%) = (scheme normal-control-font)

  enabled : (or/c any/c behavior?) = #t

  vert-margin : (integer-in 0 1000) = 2

  horiz-margin : (integer-in 0 1000) = 2

  min-width : (integer-in 0 10000) = graphical-minimum-width

  min-height : (integer-in 0 10000) = graphical-minimum-height

  stretchable-width : any/c = #f

  stretchable-height : any/c = #f

The constructor arguments are the same as in message%, except that label, enabled, stretchable-width, and stretchable-height may be time-varying.

ft-button% : class?

  superclass: button%

  extends: 

control<%>

(new ft-button%

 

[label label]

 

 

 

[parent parent]

 

 

 [

[style style]

 

 

 

[font font]

 

 

 

[enabled enabled]

 

 

 

[vert-margin vert-margin]

 

 

 

[horiz-margin horiz-margin]

 

 

 

[min-width min-width]

 

 

 

[min-height min-height]

 

 

 

[stretchable-width stretchable-width]

 

 

 

[stretchable-height stretchable-height]])

 

  (is-a?/c ft-button%)

  label : (or/c label-string? behavior (is-a?/c bitmap%))

  

parent

 

:

 

(or/c (is-a?/c frame%) (is-a?/c dialog%)

      (is-a?/c panel%) (is-a?/c pane%))

  style : (one-of/c 'border 'deleted) = null

  font : (is-a?/c font%) = (scheme normal-control-font)

  enabled : any/c = #t

  vert-margin : (integer-in 0 1000) = 2

  horiz-margin : (integer-in 0 1000) = 2

  min-width : (integer-in 0 10000) = graphical-minimum-width

  min-height : (integer-in 0 10000) = graphical-minimum-height

  stretchable-width : any/c = #f

  stretchable-height : any/c = #f

The constructor arguments are the same as in message%, except that label, enabled, stretchable-width, and stretchable-height may be time-varying.

(send a-ft-button get-value-e)  event?

returns an event stream that yields a value whenever the user clicks the button.

ft-check-box% :