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

Я создал функцию, которая возвращает функцию в 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 functions as parameters and as return value Elisp interactive function name How to Create a Temporary Function in Emacs Lisp In elisp, how do I put a function in a variable?

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

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