Name: Anonymous 2008-10-08 9:08
by reading /prog/
LAMBDA forms don't necessarily have to be closures. They're only closures if some bindings are closed over them.
(defun returns-a-closure ()
(let ((value 123))
#'(lambda (n) (prog1 (+ n value) (incf value)))))
(defun returns-a-lambda ()
#'(lambda ()))
(returns-a-lambda)
#<FUNCTION (LAMBDA ()) {2431EA1D}>
(funcall (returns-a-lambda))
NIL
(returns-a-closure)
#<CLOSURE (LAMBDA (N)) {244B035D}>
(funcall #<CLOSURE (LAMBDA (N)) {244B035D}> 1)
124
(funcall #<CLOSURE (LAMBDA (N)) {244B035D}> 0)
124
(funcall #<CLOSURE (LAMBDA (N)) {244B035D}> 0)
125
(funcall #<CLOSURE (LAMBDA (N)) {244B035D}> 0)
126
A look at the closure:
#<FUNCTION {244B035D}>
--------------------
FUNCTION: #<FUNCTION (LAMBDA (N)) {24341D55}>
Closed over values:
0: #<value cell 127 {244B0357}>
#<SB-KERNEL::RANDOM-CLASS {244B0357}>
--------------------
VALUE: 127
#<FUNCTION {24341D55}>
--------------------
NAME: (LAMBDA (N))
ARGLIST: (N)
SELF: #2=#<FUNCTION (LAMBDA (N)) {24341D55}>
NEXT: NIL
TYPE: (FUNCTION (T) (VALUES NUMBER &OPTIONAL))
CODE: #<code object "LAMBDA NIL" {24341C6F}>
A look at the lambda:
#<FUNCTION {2431EA1D}>
--------------------
NAME: (LAMBDA ())
ARGLIST: NIL
SELF: #0=#<FUNCTION (LAMBDA ()) {2431EA1D}>
NEXT: NIL
TYPE: (FUNCTION NIL (VALUES NULL &OPTIONAL))
CODE: #<code object "LAMBDA NIL" {2431E9C7}>