2010-11-16 8 views
12

Tome esta función:¿Por qué un defun no LISP requiere una cotización antes de su argumento de parámetro?

(defun sum-greater (x y z) 
(> (+ x y) z)) 

Es mi entendimiento de que en LISP el primer elemento de una lista siempre representa una función a realizar sobre los átomos posteriores/listas. Entonces, ¿por qué LISP no trata el x en (x y z) como una función que se realizará en y y z? Claramente, este no sería un comportamiento deseable, pero sería el comportamiento esperado.

¿Presumiblemente la función que define defun de alguna manera anula la evaluación LISP estándar de una lista? Si es así, ¿podrías detallar esto?

Gracias

+3

Retrasa la evaluación en todos sus otros argumentos, también: ¡obviamente no quiere '(> ...)' evaluar cuando evalúa la forma 'defun', tampoco! – Ken

+0

Buen punto, debería haber reconocido que defun fue más que una función normal de eso solo ... –

Respuesta

8

IIRC en Common Lisp al menos defun es una macro (HyperSpec), lo que significa que puede definir cualquier estrategia de evaluación alguna por sus argumentos.

+1

Ah, sí, eso tiene sentido. Todavía no he llegado al macrocapítulo de mi libro LISP. FYI - eligió esta respuesta porque es muy conciso, pero gracias a todos. –

3

Su presunción es correcta. Defun es comúnmente un special form o macro

+1

en Emacs Lisp, pero no en Common Lisp. Ahí está una macro. –

+2

Edité la respuesta antes de su comentario. Pero estabas en lo cierto. –

6

defun es especial porque es una macro. Y dado que las macros pueden ser dependientes de la implementación, todo tipo de magia negra puede ocurrir debajo del capó.

Lisp HyperSpec (Common Lisp) says, y cito textualmente: "Ninguno de los argumentos se evalúa en el tiempo de expansión de macros".

2

defun no es una función, sino una forma especial (o se reduce a una), y para estos, la mecánica de evaluación es diferente. Ejemplos similares serían si, cuando uno de los argumentos se descarta completamente sin ser evaluado en absoluto.

Cuestiones relacionadas