2011-02-05 8 views
12

Parece tanto¿Cuál es la diferencia entre 'y #' en Lisp?

(mapcar 'car '((foo bar) (foo1 bar1))) 

y

(mapcar #'car '((foo bar) (foo1 bar1))) 

trabajo como el mismo.

Y también sé ' significa (símbolo de comillas) y #' significa (función nombre-función).

¿Pero cuál es la diferencia subyacente? ¿Por qué estos 2 funcionan en el anterior mapcar?

Respuesta

13
'foo 

evalúa al símbolo FOO.

#'foo 

Evalúa la función vinculada al nombre FOO.

En Lisp un símbolo se puede llamar como una función cuando el símbolo FOO tiene un enlace de función. Aquí CAR es un símbolo que tiene un enlace de función.

Pero esto no funciona:

(flet ((foo (a) (+ a 42))) 
    (mapcar 'foo '(1 2 3 4 5))) 

Eso es porque FOO como un símbolo no tiene acceso a la función léxica local y el sistema Lisp se quejará cuando foo no es una función definida en otro lugar.

tenemos que escribir:

(flet ((foo (a) (+ a 42))) 
    (mapcar #'foo '(1 2 3 4 5))) 

Aquí el (función foo) o foo sus notación abreviada # 'se refiere al léxico FOO función local.

Tenga en cuenta también que, en

(funcall #'foo ...) 

vs

(funcall 'foo ...) 

La tarde podría hacer una más indirecta, ya que tiene que buscar la función del símbolo, mientras que foo # 'denota la función de directamente.

Resumen:

Si tiene un símbolo de unión, llamar a una función a través del símbolo funciona una función.

9

¿Por qué estos 2 funcionan en el mapa anterior?

La documentación para mapcar dice:

Si la función es un símbolo, que es forzado a una función como por symbol-function.

1

Intente pasar una función anónima (lambda) a su mapcar y verá que #' es necesario ya que la cita en sí misma espera un símbolo que está vinculado a una función, pero el símbolo no existe en una función. función llamada:

CL-USER> (mapcar '(lambda (x) (format t "it is ~d" x)) (list 3 5 7)) 
; Evaluation aborted on #<TYPE-ERROR expected-type: (OR FUNCTION SYMBOL) 
      datum: (LAMBDA (X) (FORMAT T "it is ~d" X))>. 

vs:

CL-USER> (mapcar #'(lambda (x) (format t "it is ~d" x)) (list 3 5 7)) 
it is 3it is 5it is 7 
(NIL NIL NIL) 
Cuestiones relacionadas