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?