/ / Escribir expresiones lambda en lisp común - common-lisp, lambda, clisp

Escribir expresiones lambda en el ceceo común - common-lisp, lambda, clisp

Actualmente estoy leyendo ANSI Common Lisp de Paul Graham, y tengo una pregunta sobre cómo escribir expresiones lambda.

¿Necesitamos anteponer una expresión lambda con #"?. Si escribo algo como esto en REPL, funcionará bien

> ((lambda (x) (+ x 1)) 1)
2

así será

> (mapcar (lambda (x) (+ x x)) "(1 2 3 4))
(2 4 6 8)

Entiendo que #" denota una función. Entonces mi pregunta es, ¿es algún tipo de convención o práctica recomendada? ¿Puede salir algo mal si no prefijo lambdas con #", ¿depende de la implementación?

Respuestas

19 para la respuesta № 1

La expresión LAMBDA

(lambda ...) se considera un expresión lambda solo en ciertos lugares, como el function forma o como la cabeza de una llamada de función. Las expresiones lambda no se evalúan.

(function              ; special operator FUNCTION
(lambda () "foobar)) ; <- this is a lambda expression


(                    ; a function call
(lambda (foo) foo)  ; <- this is a lambda expression
"bar                ; argument
)

Pero aquí (lambda ...) es una forma macro y no una expresión lambda:

(funcall             ; calling a function via funcall
(lambda (foo) foo)  ; this is not a lambda expressions, but the macro lambda
;  as all arguments to FUNCALL it will be
;    macro expanded and evaluated
;  it expands to (function (lambda (foo) foo))
"bar)               ; argument

La macro LAMBDA

LAMBDA es una macro Se expande (lambda ...) a (function (lambda ...)), que es el equivalente de #"(lambda ...)).

CL-USER > (macroexpand "(lambda (foo) foo))
(FUNCTION (LAMBDA (FOO) FOO))

La macro le ahorra un poco de escritura / lectura, eso es todo. En la primera versión de Common Lisp (CLtL1) no había LAMBDA macro. Se ha agregado más tarde y ahora es parte de ANSI Common Lisp,

El operador especial FUNCIÓN

FUNCIÓN Es un operador especial. Espera un nombre de función o un expresión lambda. Así el nombre o el expresión lambda No son evaluados. De hecho expresiones lambda no se puede evaluar en absoluto. Dentro FUNCTION, el expresión lambda es no una forma macro y así lo hará no se ampliará de nuevo. El propósito de FUNCTION es devolver el objeto de función correspondiente que se denota por el nombre o por el expresión lambda. Devuelve el objeto de función como un valor. Con este operador especial, se puede acceder al objeto de función desde funciones globales y funciones léxicas.

los FUNCTION El operador es necesario en Common Lisp, porque tiene espacios de nombres separados para valores, funciones y algunas otras cosas. Como un supuesto Lisp-2 o incluso Lisp-n, con dos o más espacios de nombres.

Expresiones lambda en posición de función en forma de función

((lambda (foo) foo) 10) es compatible con la sintaxis incorporada para Common Lisp. Ver Formas Lambda.

Confuso

Todo esto es lógico, pero confuso. No se preocupe, no está solo, pero en la práctica no es gran cosa.