Я создал функцию, которая возвращает функцию в Elisp:
(defun singleton-set (elem)
(defun f (n) (= n elem))
f)
Я пытаюсь запустить это в IELM, но не получается:
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)
Из-за В чем разница между Lisp-1 и Lisp-2? я изменил код на
(defun singleton-set (elem)
(defun f (n) (= n elem))
#'f)
И вызов (funcall (singleton-set 5) 5)
, но теперь ошибка
*** Eval error *** Symbol's value as variable is void: elem
Из elisp: захвата переменной из внутренней функции я понимаю, что это происходит из-за динамического связывания Emacs Lisp.
Как сделать возможным в Emacs Lisp функции, возвращающие функции? В чем причина того, что этот механизм отличается от других языков, таких как Python, Scala или Clojure?
Связанные вопросы:
defun
внутриsingleton-set
. Вместо этого используйте что-нибудь вроде(defun singleton-set (elem) #'(lambda ...))
и посмотрите на указатели @ geocar ниже. - person Dale Hagglund   schedule 19.10.2012