2016-12-24 4 views
0

In einer anonymen Funktion wieUnquote-Symbol in Lambda-Ausdruck?

(lambda() x) 

wie kann ich das Symbol x mit seinem Wert im aktuellen Bereich ersetzen?

Das einzige, was ich denken kann, ist

(eval `(lambda() ,x)) 

aber ich frage mich, ob es einen anderen Weg.

Antwort

1

Entfernen Sie die eval. Nur `(lambda() ,x).

Das gibt die Liste(lambda() VAL-X), wo VAL-X den Wert der Variablen x ist. Und eine Lambda-Liste wird von Emacs als Funktion interpretiert.

+0

Dies wird glücklich rülpsen, wenn 'x' einen Wert wie' (1 2) 'hat. – Stefan

+1

@Stefan: Ich habe versucht, so nah wie möglich am OP zu bleiben. Und das ergibt '(lambda() (1 2))' - kein Aufstoßen. Wenn Sie meinen, dass * diese * Funktion beim Aufruf auflöst, ist das ein anderes Problem (und gilt auch für das OP). Wenn 'x' wahrscheinlich etwas ist, das nicht fehlerfrei ausgewertet werden kann, ist' 'x' normalerweise angemessen. – Drew

1

Die bessere Lösung ist

;; -*- lexical-binding:t -*- 

am Anfang der Datei hinzuzufügen. Sobald Sie das getan haben, genügt es, (lambda() x) zu schreiben, da Emacs dann darauf achten wird, das x durch den Wert aus dem Bereich zu ersetzen, der dieses Lambda umgibt (d. H. Wird eine ordnungsgemäße Schließung erzeugen).

+0

Das Problem ist, dass das nicht immer möglich ist. Angenommen, Sie erweitern eine Bibliothek, die keine lexikalische Bindung verwendet. –

+0

Es ist immer möglich und in der Regel einfach, eine Datei in eine lexikalische Bindung zu konvertieren. – Stefan