2010-11-16 4 views
12

Prendete questa funzione:Perché un defun LISP non richiede una citazione prima dell'argomento parametro?

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

E 'la mia comprensione che in LISP il primo elemento di un elenco rappresenta sempre una funzione da eseguire sui successivi atomi/liste. Quindi, perché LISP non tratta loin (x y z) come una funzione da eseguire su y e z. Chiaramente questo non sarebbe un comportamento desiderabile, ma sarebbe il comportamento previsto.

Presumibilmente, la funzione che definisce defun sovrascrive in qualche modo la valutazione LISP standard di un elenco? In tal caso, potresti fornire questo dettaglio?

Grazie

+3

Ritarda la valutazione anche su tutti gli altri argomenti: ovviamente non si vuole '(> ...)' valutato quando si valuta il formato 'defun', neanche! – Ken

+0

Buon punto, avrei dovuto riconoscere che defun era più che una funzione normale da solo. –

risposta

8

IIRC in Common Lisp almeno defun è una macro (HyperSpec), il che significa che può definire qualsiasi strategia di valutazione di sorta per i suoi argomenti.

+1

Ah, giusto, questo ha senso. Non ho ancora raggiunto il capitolo macro del mio libro LISP. Cordiali saluti, ho scelto questa risposta perché è più concisa, ma grazie a tutti. –

3

La tua presunzione è corretta. Defun è comunemente un special form o macro

+1

in Emacs Lisp, ma non in Common Lisp. Lì è una macro. –

+2

Ho modificato la risposta prima del tuo commento. Ma eri del tutto corretto. –

6

defun è speciale perché è una macro. E dal momento che le macro possono essere dipendenti dall'implementazione, qualsiasi tipo di magia nera può accadere sotto il cofano.

Lisp HyperSpec (Common Lisp) says e cito: "Nessuno degli argomenti viene valutato al momento dell'espansione della macro".

2

defun non è una funzione, ma una forma speciale (o si riduce a uno), e per questi, la meccanica di valutazione è diversa. Esempi simili sarebbero se, dove uno degli argomenti è addirittura scartato completamente senza essere valutato affatto!