Warum funktioniert die Anwendung der vom elisp-Makro zurückgegebenen Funktion nicht?

8

Hier ist zum Beispiel ein Makro:

%Vor%

und (my-macro 2 3) gibt (lambda (z) (+ z 3))

zurück

Jedoch gibt ((my-macro 2 3) 1) einen Fehler zurück, der besagt,

%Vor%

Was vermisse ich?

    
user328148 21.06.2011, 22:55
quelle

2 Antworten

7

Emacs Lisp benötigt das erste Element einer Liste Formular eine eingebaute Funktion sein (oder subr ) , ein Lambda-Ausdruck (dh (lambda LIST . LIST) ) oder ein Makro-Lambda-Ausdruck (dh% Code%). Das erste Element kann auch ein -Symbol sein, dessen Funktion Slot enthält ein gültiges erstes Element.

(macro lambda LIST . LIST) hat nicht die erforderliche Form, daher ist es eine ungültige Funktion.

Wenn Sie an Scheme gewöhnt sind, wo der Funktionsteil eines Funktionsaufrufs normal ausgewertet wird, beachten Sie, dass dies in Lisp nicht identisch funktionieren kann, wenn Funktionen einen anderen Namensraum haben ( (my-macro 2 3) sucht (f 3) s nach) Funktions-Slot, während der Wert von f normalerweise sein Wert slot ist.

Wenn Sie eine Funktion wie einen normalen Wert auswerten möchten, können Sie f oder funcall .

%Vor%     
Gilles 21.06.2011, 23:19
quelle
0

Wie die Fehlermeldung deutlich macht, erweitert Emacs bei der Auswertung der Form ((my-macro 2 3) 1) nicht (my-macro 2 3) vor der Auswertung der Liste, es ist das erste Element von. Du willst sagen

%Vor%

oder

%Vor%

oder etwas ähnliches, damit das Makro ausgewertet wird.

    
Sean 21.06.2011 23:11
quelle

Tags und Links