Next: Conditionals, Previous: Procedure calls, Up: Primitive expression types [Index]
Syntax: ⟨Formals⟩ is a formal arguments list as described below, and ⟨body⟩ is a sequence of zero or more definitions followed by one or more expressions.
Semantics: A lambda
expression evaluates to a procedure. The
environment in effect when the lambda
expression was evaluated is
remembered as part of the procedure. When the procedure is later called with
some actual arguments, the environment in which the lambda
expression
was evaluated will be extended by binding the variables in the formal
argument list to fresh locations, and the corresponding actual argument
values will be stored in those locations. (A fresh location is one
that is distinct from every previously existing location.) Next, the
expressions in the body of the lambda
expression (which, if it
contains definitions, represents a letrec*
form—See Binding constructs) will be evaluated sequentially in the extended environment. The
results of the last expression in the body will be returned as the results
of the procedure call.
((lambda (x) (+ x x)) ⇒ a procedure
((lambda (x) (+ x x)) 4) ⇒ 8
(define reverse-subtract (lambda (x y) (- y x))) (reverse-subtract 7 10) ⇒ 3 (define add4 (let ((x 4)) (lambda (y) (+ x y)))) (add4 6) ⇒ 10
⟨Formals⟩ have one of the following forms:
(
⟨variable1⟩ …)
: The procedure takes a fixed
number of arguments; when the procedure is called, the arguments will be
stored in fresh locations that are bound to the corresponding variables.
(
⟨variable1⟩ … ⟨variablen⟩ .
⟨variablen+1⟩)
: If a space-delimited period precedes the
last variable, then the procedure takes n or more arguments, where
n is the number of formal arguments before the period (it is an error
if there is not at least one). The value stored in the binding of the last
variable will be a newly allocated list of the actual arguments left over
after all the other actual arguments have been matched up against the other
formal arguments.
It is an error for a ⟨variable⟩ to appear more than once in ⟨formals⟩.
((lambda x x) 3 4 5 6) ⇒ (3 4 5 6) ((lambda (x y . z) z) 3 4 5 6) ⇒ (5 6)
Each procedure created as the result of evaluating a lambda
expression is (conceptually) tagged with a storage location, in order to
make eqv?
and eq?
work on procedures (See Equivalence predicates).
Next: Conditionals, Previous: Procedure calls, Up: Primitive expression types [Index]