Hello,
the most powerful thing in elisp is program as data but what does it mean how can I run data as a program. I was confused too but here is what I found.
First I tried this:
(setq x '(+ 1 3))
(x)
basically setting the value of x as a list. now x is set to some code but when I try to run x as function using (x) syntax we get this error *** Eval error *** Symbol’s function definition is void: x
. It tried to look for function in x but couldn't find it. then how can I run the code that I stored in a variable? how to evaluate it? we need a built-in function eval.
If we run this code it works and outputs 4:
(setq x '(+ 1 3))
(eval x)
so yeah, it is how you can evaluate a code stored in a variable. feel free to correct me if there is another way to achieve it :)
Your experiments bump into the difference between so called Lisp 1 and Lisp 2 systems. In Lisp 2 systems like elisp, variables and functions have separate namespaces. The same name can be bound to both a function and a variable, or to just one, or to neither. In your first example, you assign a value to the variable slot of
x
, but the function slot is still unspecified. So when you try to call it as a function, you are told that its "function definition is void" -- it doesn't have a function associated with it. In another lisp, that might have worked.