Pregunta

¿Por qué debo usar #' junto con lambda? Por lo general, se escribe de esa manera, así que supongo que es una buena forma. Sin embargo, estas líneas parecen iguales a mí:

> (mapcar #'(lambda (x) (+ x 1)) '(1 2 3))
(2 3 4)
> (mapcar (lambda (x) (+ x 1)) '(1 2 3))
(2 3 4)

A alguien para iluminar un principiante sobre la diferencia?

¿Fue útil?

Solución

#' es la abreviatura de function, que devuelve un puntero a una función (en lugar de aplicarlo). lambda devuelve una función, y es habitual querer un puntero a esa función. Puesto que esto es tan común, también hay una macro (en el espacio de variables) que lo hace por usted, que se llama así lambda. Ambas líneas de código son idénticos.

¿Qué es mejor se reduce a la Lisp-1/2-Lisp debate : en Common Lisp puede hacer cualquiera, gracias a la macro. Como siempre, ser coherente.

Otros consejos

Es diferente en varios dialectos Lisp. A continuación se utiliza Common Lisp:

Primero #' es un corto notación para (función ...) . Así que la siguiente información sólo son textualmente diferente, pero Common Lisp les dice lo mismo:

#'(lambda (x) (* x 2))

y

(function (lambda (x) (* x 2)))

#' es un readmacro, y transforma cuando el código Lisp es leído por el sistema Lisp.

Si Lisp evalúa

(function (lambda (x) (* x 2)))

sistema Lisp crea un objeto de función y función devuelve como su valor .

Por lo tanto, cada vez que necesite una función como un valor, entonces tiene que escribir así. Se necesita una función como un valor, cuando se quiere transmitir a otras funciones como un argumento, cuando se quiere volverlo a partir de una función o cuando se desea almacenar en una variable. Ejemplos:

(map #'(lambda (x) (* x 2)) '(1 2 3))

(defun (y) #'(lambda (x) (* x y)))

(defparameter *twice-fn* #'(lambda (x) (* x 2)))

Ahora, lo que es (lambda (x) (* x 2))?

Es dos cosas diferentes según el contexto.

expresión Lambda

La expresión lambda se puede utilizar en lugar de un nombre de función:

(function foo)   and    (function (lambda (x) (* x 2)))

y

(foo 17)    and  ((lambda (x) (* x 2)) 17)

Sobre dos son sintaxis legal Common Lisp. Hay una expresión lambda puede ser utilizado directamente.

Tenga en cuenta que las dos formas siguientes son ilegal en Common Lisp:

(#'(lambda (x) (* x 2)) 17)   ; illegal in Common Lisp

(function #'(lambda (x) (* x 2)))  ; illegal in Common Lisp

Macro

Durante el proceso de normalización Common Lisp una macro LAMBDA ha sido añadido (que no era parte de la primera descripción, CLtL1, de Common Lisp). Esto hace que sea posible escribir código ligeramente más corto. Ejemplo:

(lambda (x) (* x 2))

En caso anterior LAMBDA es un macro. Durante la expansión macro que se ampliará a:

(function (lambda (x) (* x 2)))

Recuerde que en forma de función anterior, el lambda interior es parte de una expresión lambda, denota la función y no se expandió.

Así pues, ahora los tres ejemplos de arriba se pueden escribir como:

(map (lambda (x) (* x 2)) '(1 2 3))

(defun (y) (lambda (x) (* x y)))

(defparameter *twice-fn* (lambda (x) (* x 2)))

Es un poco más corto, se ve un poco más despejado y se ve un poco más similar al código de Scheme. Sólo está un poco mejor para los programadores utilizan para leer y escribir código de Scheme.

Resumen

a) (function (lambda (x) (x 2 *))) es el camino 'verdadero' para escribir código que devuelve una función como un valor.

b) # '(lambda (x) (* x 2)) es una notación más corta de arriba

c) (lambda (x) (* x 2)) es aún más corto, pero utiliza expansión de macro para crear la forma de a).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top