|Steele and Sussman||March 10, 1976||34||LAMBDA: The Ultimate Imperative|
(LABELS ((<name1> <lambda-exp1>)
. . .
A new environment is created in which the names
<namei> are bound to closures of the lambda
<lambda-expi>; the lambda expressions are closed in this new environment, and so may refer to each other. The
<body> is then evaluated in this new environment.
LABEL construct of LISP 1.5:
((LABEL <name> <1ambda-exp>) <arg1> <arg2> ... <argn>)
may be written as a
LABELS in SCHEME:
(LABELS ((<name> <lambda-exp>))
(<name> <arg1> <arg2> ... <argn>))
In [Landin 65] Landin uses this same technique to model call-by-name. However, he modelled assignment to call-by-name parameters in a way much different from the one we use later: he uses L-values rather than an extra assignment thunk.
This was realized as early as 1960 by John McCarthy. In section 6 of [McCarthy 60] he describes a technique for transforming a flowchart into a purely recursive procedure.
The MDL language (formerly known as MUDDLE) [Galley 75] uses cached value cells, but uses a process number rather than a side effect count to determine the validity of the cache data, the purpose being to share a cache among several processes.
This indicates an obvious method for implementing fluid variables in PLASMA in a natural way. All that would be required is a slight change to the implicitly supplied continuations.
This is discussed in detail in [Sussman 75], where an actual implementation is described. The theoretical justification is described there, and later in this paper also.
SCHEME is fully described in [Sussman 75], which contains a complete reference manual as well as a fully documented implementation of the language in MacLISP [Moon 74].