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, #'fooif fooè una funzione, quindi potrebbe essere considerato più coerente usarlo anche per il lambdacaso;
  • 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.