Funções de ordem superior no Elisp

Eu criei uma função que retorna uma função no Elisp:

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

Eu tento executar isso no IELM e ele falha:

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)

Devido aQual é a diferença entre Lisp-1 e Lisp-2? eu mudei o código para

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

E invocação para(funcall (singleton-set 5) 5), mas agora o erro é

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

Eu entendo deelisp: capturando variáveis ​​da função interna que isso se deve à ligação dinâmica do Emacs Lisp.

Como fazer funções retornando funções possíveis no Emacs Lisp? Por que esse mecanismo é diferente de outras linguagens como Python, Scala ou Clojure?

Perguntas relacionadas:

elisp funciona como parâmetro e como valor de retornoNome da função interativa ElispComo criar uma função temporária no Emacs LispEm elisp, como faço para colocar uma função em uma variável?

questionAnswers(3)

yourAnswerToTheQuestion