I created a function that returns a function in Elisp:
(defun singleton-set (elem) (defun f (n) (= n elem)) f)
I try to run this in IELM and it fails:
ELISP> (singleton-set 5) *** Eval error *** Symbol value as variable is void: f ELISP> ((singleton-set 5) 5) *** Eval error *** Invalid function: (singleton-set 5)
Because of what is the difference between Lisp -1 and Lisp -2? I changed the code to
(defun singleton-set (elem) (defun f (n) (= n elem)) #'f)
And a call in (funcall (singleton-set 5) 5) , but now an error
*** Eval error *** Symbol value as variable is void: elem
I understand from elisp: capturing a variable from an internal function , which is related to the dynamic binding of Emacs Lisp.
How to make functions returning functions possible in Emacs Lisp? What is the reason that this mechanism is different from other languages ββlike Python, Scala or Clojure?
Related questions:
- 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?
dynamic-binding emacs elisp higher-order-functions
Mirzhan Irkegulov
source share