I don't know how lisp macro construct its expansion? what's the exact step?
emacs, expansion, lisp, macros
Solution
When I evaluate these forms in Emacs, I get this error message when evaluating the second one:
Debugger entered--Lisp error: (wrong-type-argument number-or-marker-p (quote (+ 1 2)))
*(2 (quote (+ 1 2)))
(lambda (var) (* 2 var))((quote (+ 1 2)))
(times_two (quote (+ 1 2)))
eval((times_two (quote (+ 1 2))))
eval-last-sexp-1(nil)
eval-last-sexp(nil)
call-interactively(eval-last-sexp nil nil)
This is showing you how it expanded the macro, which should tell you what went wrong. (The final expansion is at the top.)
The quoted expression `'(+ 1 2)` gets passed to the times_two macro, but a quoted list is not a valid argument to the `*` function.
What you actually want here is:
(defmacro times_two (var) `(* 2 ,var))
(times_two (+ 1 2))
Keep in mind that, generally, the result of a macro will be new Lisp code, not a final value. Your goal in writing a macro is to construct the form that will give you the result you want. Thus, most of the time your macro will end up using the quasiquote (`) syntax.
Problem
I tried to write a macro and execute it as follow. but it failed to execute. ``` (defmacro times_two (var) (* 2 var)) (times_two '(+ 1 2)) ``` In my imagination, I think the expansion would be (* 2 (+ 1 2)). and after execution, the result would be 6. But failed. I don't know why. I read the Emacs lisp manual, but I still can't understand them. I want to know what on earth the exact steps is while constructing expansion. What did the interpreter do?