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?