Функции высшего порядка в Элиспе

Я создал функцию, которая возвращает функцию в 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)

Из-заВ чем разница между Лисп-1 и Лисп-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?

Смежные вопросы:

elisp функционирует как параметры и как возвращаемое значениеНазвание интерактивной функции ElispКак создать временную функцию в Emacs LispВ elisp, как поместить функцию в переменную?

Ответы на вопрос(3)

Ваш ответ на вопрос