Sie sind ziemlich austauschbar. Die Antwort ist, dass function
ermöglicht, dass das Lambda Byte kompiliert wird, während die anderen beiden nicht (und sind äquivalent). Hinweis: dies bedeutet nicht, dass function
tatsächlich Byte das Lambda kompiliert.
Wie könnte man das herausfinden? Eine kleine Emacs Lisp-Introspektion gibt einige Hinweise. Zu Beginn: C-h f Funktion RET :
Funktion ist eine spezielle Form in 'C Quellcode '.
(Funktion arg)
Wie "Zitat", aber bevorzugt für Objekte, die Funktionen sind. In Byte Kompilation, 'Funktion' verursacht seine Argument zu kompilieren. 'Zitat' kann das nicht tun.
Ok, das ist also der Unterschied zwischen (function (lambda ...))
und '(lambda ...)
, der erste teilt dem Byte-Compiler mit, dass er den Ausdruck sicher kompilieren kann. Die ' ed-Ausdrücke müssen nicht unbedingt kompiliert werden (denn sie könnten nur eine Liste von Zahlen sein.
Was ist nur mit dem nackten (lambda ...)
? C-h f Lambda RET zeigt:
Lambda ist ein Lisp-Makro in 'subl.el'.
(lambda args [docstring] [interaktiv] Körper)
Gib einen Lambda-Ausdruck zurück. Ein Anruf von die Form (Lambda args Docstring interaktiver Körper) ist selbst zitierend; das Ergebnis der Bewertung des Lambda Ausdruck ist der Ausdruck selbst. Der Lambda-Ausdruck kann dann sein behandelt als eine Funktion, d. h. gespeichert als der Funktionswert eines Symbols, übergeben zum 'funcall' oder 'mapcar', usw.
Daher sind (lambda ...)
und '(lambda ...)
gleichwertig.
Außerdem gibt es die Notation #'(lambda ...)
, die syntaktischer Zucker für (function (lambda ...))
ist.
Weitere Informationen zu Funktionen in Emacs lisp finden Sie auf den Funktionen-Infoseiten .
Um das alles zu überprüfen, können Sie Folgendes in den * scratch * -Puffer eingeben und die Ausdrücke auswerten:
%Vor%So, alle drei Varianten der Verwendung von Lambda nur Listen aufbauen, die als Funktionen verwendet werden können (von denen eine Byte compiliert sein kann).
Well (quote (lambda...))
und (lambda...)
sind nicht äquivalent (beim Kompilieren von Bytes). Quoted Lambdas sind nicht Byte kompiliert, während alles andere ist.
Zum Beispiel:
%Vor% Normalerweise möchten Sie kein Lambda zitieren, es sei denn, die Funktion, an die Sie das Lambda übergeben wollen, tut etwas anderes damit, als nur funcall
it.
Tags und Links emacs comparison elisp