The unit defined below imports and exports no variables. Each time it
is invoked, it prints and returns the current time in
seconds:
(define f1@
(unit
(import) (export)
(define x (current-seconds))
(display x) (newline) x))
The expression below is syntactically invalid because current-date is not a built-in procedure:
(define f2-bad@
(unit
(import) (export)
(define x (current-date))
(display x) (newline) x))
but the next expression is valid because the unit expression is
in the scope of the let-bound variable:
(define f2@
(let ([current-date current-seconds])
(unit
(import) (export)
(define x (current-date))
(display x) (newline) x)))
The following units define two parts of an interactive phone book:
(define database@
(unit (import show-message)
(export insert lookup)
(define table (list))
(define insert
(lambda (name info)
(set! table (cons (cons name info) table))))
(define lookup
(lambda (name)
(let ([data (assoc name table)])
(if data
(cdr data)
(show-message "info not found")))))
insert))
(define interface@
(unit (import insert lookup make-window make-button)
(export show-message)
(define show-message
(lambda (msg) ...))
(define main-window
...)))
In this example, the database@ unit implements the
database-searching part of the program, and the interface@ unit
implements the graphical user interface. The database@ unit
exports insert and lookup procedures to be used by the
graphical interface, while the interface@ unit exports a
show-message procedure to be used by the database (to handle
errors). The interface@ unit also imports variables that will
be supplied by an platform-specific graphics toolbox.