Emacs Lisp: Unterschied zwischen (Funktion (Lambda ...)) und (Lambda ...)?

8

Was ist der Unterschied zwischen

? %Vor%

und

%Vor%

und

%Vor%

?

Es scheint, dass drei in vielen Fällen austauschbar sind.

    
Yoo 05.12.2009, 17:39
quelle

2 Antworten

12

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).

    
Trey Jackson 06.12.2009, 00:06
quelle
3

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.

    
user402672 26.07.2010 19:35
quelle

Tags und Links