2009-12-05 7 views

Antwort

12

Sie sind ziemlich austauschbar. Die Antwort ist, dass functionermöglicht das Lambda, um Byte kompiliert werden, während die anderen beiden nicht (und sind äquivalent). Hinweis: dies bedeutet nicht, dass function tatsächlich Byte das Lambda kompilieren.

Wie könnte man das herausfinden? Eine kleine Emacs Lisp-Introspektion gibt einige Hinweise. Start: C-h f Funktion RET:

Funktion ist eine spezielle Form in 'C Quellcode'.

(Funktion arg)

Like 'Zitat', aber für Objekte bevorzugt, die Funktionen sind. Im Byte Kompilierung bewirkt "Funktion", dass das Argument kompiliert wird. 'quote' kann das nicht tun.

Ok, so dass der Unterschied zwischen (function (lambda ...)) und '(lambda ...), der erste erzählt die Byte-Compiler, der es sicher den Ausdruck zusammenstellen kann. Während der ' ed Ausdrücke nicht unbedingt erstellt werden (für sie nur eine Liste von Zahlen sein könnten

Was ist nur die nackten (lambda ...)Ch f Lambda RET zeigt:.?

Lambda ein Lisp-Makro in `subr.el‘.

(Lambda args [docstring] [interactive] Körper)

Return ein Lambda-Ausdruck. A Anruf von das Formular (Lambda args Docstring interaktive Körper) ist selbst zitierend; Das Ergebnis der Auswertung des Lambda Ausdruckes ist der Ausdruck selbst. Der Lambda-Ausdruck dann als eine Funktion behandelt werden können, dh als den Funktionswert eines Symbols gespeichert, übergeben zu ‚FUNCALL‘ oder ‚mapcar‘ usw.

Daher (lambda ...) und '(lambda ...) sind gleichwertig.

Auch gibt es die Notation #'(lambda ...), die syntaktischer Zucker für (function (lambda ...)) ist.

Weitere Informationen zu Funktionen in Emacs lisp finden Sie unter Functions info pages.

Genau dies alles zu überprüfen, können Sie die Ausdrücke die folgende in den * scratch * buffer und bewerten Typ:

(caddr '(lambda (x) (+ x x))) 
(+ x x) 

(caddr (lambda (x) (+ x x))) 
(+ x x) 

(caddr (function (lambda (x) (+ x x)))) 
(+ x x) 

(equal '(lambda (x) (+ x x)) 
     (function (lambda (x) (+ x x)))) 
t 

(equal '(lambda (x) (+ x x)) 
     (lambda (x) (+ x x))) 
t 

So sind alle drei Varianten von Lambda mit nur Listen aufzubauen, die wie verwendet werden kann, Funktionen (von denen eine Byte kompiliert werden kann).

+0

Aber verwendet nicht ein einzelnes Zitat vor einem Ausdruck, der den LISP-Interpreter gibt, wie er ist und es nicht auswertet? Das würde bedeuten, dass '(+ 1 2) als (+ 1 2) und (+ 1 2) als 3 ... – Joscha

+0

@Joscha zurückkommt, nicht sicher, an welchem ​​Teil Sie kommentieren. Lambda ist selbst zitierend, was nur bedeutet, dass, wenn der Interpreter einen Lambda-Ausdruck evaluiert, das Ergebnis derselbe Lambda-Ausdruck ist. Ich glaube, das ist anders als bei den meisten anderen Lisps wegen der von Emacs verwendeten Variablensuche (unbestimmter Umfang und dynamischer Umfang). Das Schema erzeugt aufgrund der lexikalischen Ausdehnung (glaube ich) kleine Schließungen mit einigen Umgebungsinformationen. –

+2

'(lambda ...)' ist tatsächlich äquivalent zu '(function (lambda ...))' not '(lambda ...)' wie man es durch Auswerten von '(macroexpand (lambda (x) (+ xx))) ' – nschum

3

Nun (quote (lambda...)) und (lambda...) sind nicht gleichwertig (wenn Byte Compiling). Quoted Lambdas sind nicht Byte kompiliert, während alles andere ist.

Zum Beispiel:

(defun foo (a) 
    (byte-code-function-p a)) 

(defun bar() 
    (foo '(lambda() (ignore 'me)))) 

(defun bar2() 
    (foo (lambda() (ignore 'me)))) 

(defun bar3() 
    (foo (function (lambda() (ignore 'me))))) 

(defun bar4() 
    (foo #'(lambda() (ignore 'me)))) 

(byte-compile 'bar) 
(byte-compile 'bar2) 
(byte-compile 'bar3) 
(byte-compile 'bar4) 

(bar) ; -> nil 

(bar2) ; -> t 
(bar3) ; -> t 
(bar4) ; -> t 

Sie in der Regel nicht wollen, eine Lambda es sei denn, die Funktion zitieren Sie das Lambda passieren wollen ist als funcall es einfach etwas anderes mit ihm zu tun.

+1

Ich glaube, das hat sich im Laufe der Zeit geändert. Betrachtet man '(info" (elisp) Anonymous Functions "), so heißt es:" Heutzutage ist es möglich, 'Funktion' ganz wegzulassen ... Dies liegt daran, dass 'Lambda' selbst 'Funktion' bedeutet. " Diese Seite ist beim ersten Lesen etwas verwirrend, aber Ihre Beispiele machen eine gute Erklärung :) (a) '(Funktion (Lambda ...))' ist eine Variante von '(Zitat (Lambda ...)) 'ermöglicht die Kompilierung von Bytes. (b) * un * -Quote '(Lambda ...)' ist (heutzutage) dasselbe wie '(Funktion (Lambda ...))'! – phils

Verwandte Themen