2012-06-26 18 views
18

estoy confundido acerca de cómo defun macro funciona, porquepor qué defun no es lo mismo que (setq <name><lambda>)?

(defun x() "hello") 

creará función de x, pero el símbolo x todavía estará unido.

Si voy a obligar a algunos a lambda x entonces x tendrá un valor, pero no va a ser tratado por el intérprete como función de forma de esta manera:

(x) 

creo que está relacionado con el hecho de que defun debería definir la función en el entorno global, pero no estoy seguro de qué significa exactamente. ¿Por qué no puedo seguirlo en el entorno actual?

¿Hay alguna manera de obligar al intérprete a tratar el símbolo como función si alguna lambda estuviera vinculada a él? Por ejemplo:

(setq y (lambda() "I want to be a named function")) 
(y) 

P.S .: Estoy usando SBCL.

Respuesta

20

Common Lisp tiene diferentes espacios de nombres para las funciones y valores.

Defina funciones en el espacio de nombres de funciones con DEFUN, FLET, LABELS y algunas otras.

Si desea obtener un objeto de función como valor, use FUNCTION.

(defun foo (x) (1+ x)) 

(function foo) -> #<the function foo> 

o más corto:

#'foo -> #<the function foo> 

Si desea llamar a una función, entonces se escribe (foo 100).

Si desea llamar a la función como un valor, entonces usted necesita utilizar FUNCALL o APPLY:

(funcall #'foo 1) 

Puede pasar funciones alrededor y llamarlos:

(defun bar (f arg) 
    (funcall f arg arg)) 

(bar #'+ 2) -> 4 

En el caso de DEFUN:

No es (setf (symbol-value 'FOO) (lambda ...)).

Es más como (setf (symbol-function 'foo) (lambda ...)).

Tenga en cuenta que los dos espacios de nombres que permiten escribir:

(defun foo (list) 
    (list list)) 

(foo '(1 2 3)) -> ((1 2 3)) 

No hay conflicto entre la función incorporada LIST y la variable LIST. Como tenemos dos espacios de nombres diferentes, podemos usar el mismo nombre para dos propósitos diferentes.

Tenga en cuenta también que en el caso de las funciones locales no existe el símbolo involucrado. Los espacios de nombres no están necesariamente relacionados con los símbolos. Por lo tanto, para las variables locales, no es posible buscar una función a través de un nombre de símbolo.

5

Common Lisp tiene múltiples ranuras para cada símbolo, incluyendo un valor de ranura y una ranura de función. Cuando utiliza la sintaxis (x), el lisp común busca la función-slot-binding de x. Si desea llamar al enlace de valor, use funcall o apply.

Ver http://cl-cookbook.sourceforge.net/functions.html

Cuestiones relacionadas