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 № 1La 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.