C'è una differenza tra "#" (lambda ... "e" (lambda ... "? [Duplicato]
Dec 14 2020
In Practical Common Lisp c'è un esempio di REMOVE-IF-NOTcon un lambda:
CL-USER> (remove-if-not #'(lambda (x) (evenp x)) '(1 2 3 4 5))
(2 4)
È diverso da:
CL-USER> (remove-if-not (lambda (x) (evenp x)) '(1 2 3 4 5))
(2 4)
Un (lambda..)valore coincide con la forma della funzione tra virgolette #'(..)? Su REPL sembra di sì, ma dato che sono nuovo in Lisp potrei trascurare qualcosa (e sicuramente ho sbagliato la verbosità, quindi per favore correggimi anche su questo).
Risposte
4 tfb Dec 14 2020 at 19:03
Queste due cose sono, come sospetti, le stesse:
#'è una macro di lettura e#'xviene letta come(function x). Quindi#'(lambda (...) ...)viene letto come(function (lambda (...) ...)), dov'èfunctionl'operatore speciale in CL che dice che il suo argomento denota una funzione;lambdaè definito come una macro: l'espansione di(lambda (...) ...)is(function (lambda (...) ...): la forma identica alla precedente.
Ciò significa che #'(lambda (...) ...), (lambda (...) ...)e (function (lambda (...) ...))sono tutti la stessa cosa in CL: denotano tutti la funzione specificata da (lambda (...) ...)nell'ambiente lessicale corrente.
Ci sono due ragioni per cui le persone potrebbero ancora utilizzare la #'(lambda (...) ...)versione:
- coerenza: è necessario, ad esempio,
#'fooiffooè una funzione, quindi potrebbe essere considerato più coerente usarlo anche per illambdacaso; - non era sempre il caso in CL che
lambdaaveva la definizione di macro che ha ora, quindi il codice che è stato scritto tra la specifica CL originale e lo standard ANSI, o che è stato scritto da persone che ricordano quei tempi, può usare il#'modulo.