F: Wann, wenn überhaupt, ist es sinnvoll, a scharf zu zitieren lambda
, und wann, wenn überhaupt, müssen wir a nicht scharf zu zitieren lambda
?
Die Leute benutzen lambda
s auf drei Arten:
- einfach:
(lambda (x) x)
- zitiert:
'(lambda (x) x)
- scharf zitiert:
#'(lambda (x) x)
In diesem SO-Thread werden die drei Typen erörtert, in diesem SO-Thread wird erläutert, warum nicht zitiert werden soll (NB: not sharp quote ) lambda
, und in diesem SO-Thread werden auch die Unterschiede zwischen Zitieren und scharfem Zitieren erörtert.
Nun, der manuelle Knoten für anonyme Funktionen und der Docstring für die lambda
Notiz, dass lambda
s sich selbst zitieren:
Ein Aufruf des Formulars
(lambda ARGS DOCSTRING INTERACTIVE BODY)
ist selbsterklärend; Das Ergebnis der Auswertung des Lambda-Ausdrucks ist der Ausdruck selbst. Der Lambda-Ausdruck kann dann als eine Funktion behandelt werden ...
Es scheint also, dass (lambda (x) x)
und #'(lambda (x) x)
äquivalent sind, ist es aber '(lambda (x) x)
nicht (am wichtigsten beim Kompilieren von Bytes).
Es sieht aus wie würde man selten wollen , zitiert ein lambda
, aber es ist mir unklar, wann, wenn überhaupt, sollten wir oder sollte nicht scharf Zitat:
- Ist scharfes Zitieren
lambda
einfach eine stilistische Wahl, oder gibt es Umstände, unter denen scharfes Zitieren tatsächlich nützlich ist? - Gibt es Umstände, unter denen wir a nicht scharf zitieren dürfen
lambda
, das heißt, wenn dies die Bedeutung des Codes verändern würde?
lambda
es sich um ein Makro handelt, das dasfunction
für so zurück wie möglich hinzufügt . IOW, wenn#'
es irgendwann gebraucht wurde, befand es sich in einem sehr frühen Entwicklungscode. Es wurde sicher nicht schon in Emacs-18 benötigt.Da
lambda
es keinen Sinn macht, wenn es nicht zitiert wird, folgen neuere Versionen von Emacs Lisp (ANSI) Common Lisp bei der Interpretation(lambda...)
als nicht zitiert#'(lambda...)
. Die beiden Notationen sind fast genau gleich (außer innerhalb der angegebenen Struktur).Ob Sie es bevorzugen
(lambda...)
oder nicht,#'(lambda...)
ist daher eine reine Stilfrage. Einige Leute bevorzugen die nackte Form, die syntaktisches Rauschen vermeidet, während andere (einschließlich ich) die zitierte Form bevorzugen.quelle
Hinzufügen einer zusätzlichen Geschichte, um das historische Erbe von Is # '(lambda ...) zu sehen?
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=4290 schlägt Folgendes vor:
Ich weiß nichts über den Byte-Compiler, aber ich kann feststellen, dass das
lambda
Makro selbst bereits 1993 ein(function (lambda ...))
Formular zurückgegeben hat.https://www.iro.umontreal.ca/~monnier/hopl-4-emacs-lisp.pdf sagt auch:
quelle
Ich möchte nur ein praktisches Beispiel für die Verwendung des backtischen Lambda-Ausdrucks geben. Es geht um lexikalisches Binden / Variablen-Shadowing, die Verwendung eines Lambda-Ausdrucks und die Referenzierung von Variablen mit einem Komma ermöglichen es, ihren globalen Wert zu ermitteln.
M-x [RET] eval-buffer
gibt "Random old" ausM-x [RET] eval-buffer
gibt "Random" ausEin drittes Beispiel, das eine globale Variable und eine lokale Variable der Variablen kombiniert
M-x [RET] eval-buffer
gibt "Random" aus "Random old"quelle