Funciones de orden superior en Elisp

Creé una función que devuelve una función en Elisp:

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

Intento ejecutar esto en IELM, y falla:

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)

Debido a¿Cuál es la diferencia entre Lisp-1 y Lisp-2? Cambié el código a

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

Y la invocación a(funcall (singleton-set 5) 5), pero ahora el error es

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

Entiendo deelisp: captura de la variable desde la función interna que esto se debe a la vinculación dinámica de Emacs Lisp.

¿Cómo hacer que las funciones que devuelven funciones sean posibles en Emacs Lisp? ¿Cuál es la razón por la que este mecanismo es diferente de otros lenguajes como Python, Scala o Clojure?

Preguntas relacionadas:

Elisp funciona como parámetros y como valor de retorno.Elisp función interactiva nombreCómo crear una función temporal en Emacs LispEn elisp, ¿cómo pongo una función en una variable?

Respuestas a la pregunta(3)

Su respuesta a la pregunta