Funktionen höherer Ordnung in Elisp

Ich habe eine Funktion erstellt, die eine Funktion in Elisp zurückgibt:

(defun singleton-set (elem)
  (defun f (n) (= n elem))
  f)

Ich versuche dies in IELM auszuführen und es schlägt fehl:

ELISP> (singleton-set 5)
*** Eval error ***  Symbol's value as variable is void: f
ELISP> ((singleton-set 5) 5)
*** Eval error ***  Invalid function: (singleton-set 5)

DurchWas ist der Unterschied zwischen Lisp-1 und Lisp-2? Ich habe den Code in geändert

(defun singleton-set (elem)
  (defun f (n) (= n elem))
  #'f)

Und Aufruf an(funcall (singleton-set 5) 5), aber jetzt ist der Fehler

*** Eval error *** Symbol's value as variable is void: elem

Ich verstehe vonelisp: Variable aus innerer Funktion erfassen dass dies auf die dynamische Bindung von Emacs Lisp zurückzuführen ist.

Wie erstelle ich in Emacs Lisp Funktionen, die Funktionen zurückgeben? Was ist der Grund, warum sich dieser Mechanismus von anderen Sprachen wie Python, Scala oder Clojure unterscheidet?

Verwandte Fragen:

elisp fungiert als Parameter und als RückgabewertName der interaktiven Funktion von ElispSo erstellen Sie eine temporäre Funktion in Emacs LispWie setze ich in elisp eine Funktion in eine Variable?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage