Funkcje wyższego rzędu w Elisp

Stworzyłem funkcję, która zwraca funkcję w Elisp:

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

Próbuję uruchomić to w IELM i to się nie udaje:

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)

SpowodowanyJaka jest różnica między Lisp-1 a Lisp-2? Zmieniłem kod na

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

I inwokacja do(funcall (singleton-set 5) 5), ale teraz jest błąd

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

Rozumiem odelisp: zmienna przechwytująca z funkcji wewnętrznej że jest to spowodowane dynamicznym wiązaniem Emacsa Lispa.

Jak sprawić, by funkcje zwracały funkcje w Emacs Lisp? Z jakiego powodu ten mechanizm różni się od innych języków, takich jak Python, Scala czy Clojure?

Powiązane pytania:

elisp działa jako parametry i jako wartość zwracanaWyraźna nazwa funkcji interaktywnejJak utworzyć tymczasową funkcję w Emacs LispW elisp, jak mogę umieścić funkcję w zmiennej?

questionAnswers(3)

yourAnswerToTheQuestion