我试图让我的宏在返回结果之前对其结果做额外的评估。可以不这样做eval吗?
我正在尝试解决以下练习4中的问题:
- 定义一个宏nth-expr,它接受整数n和任意数量的表达式,计算第n个表达式并返回其值。如果您假设第一个参数是文字整数,则此练习很容易解决。
4.作为练习3,但假设第一个参数是要求值的表达式。
让宏选择正确的表达式很容易:
(defmacro nth-expr% (n &rest es)
`(nth ,n ',es))
CL-USER> (defvar i 1)
I
CL-USER> (nth-expr% (1+ i) (+ 2 3) (- 4 3) (+ 3 1))
(+ 3 1)
Run Code Online (Sandbox Code Playgroud)
该表达式(+ 3 1)是我们想要的表达式,但是我们希望宏在返回它之前将其求值为4。
当然可以用eval完成:
(defmacro nth-expr%% (n &rest es)
`(eval (nth ,n ',es)))
CL-USER> (nth-expr%% (1+ i) (+ 2 3) (- 4 3) (+ 3 1))
4
Run Code Online (Sandbox Code Playgroud)
但是还有另一种方法吗?
感觉解决方案应该是将其主体nth-expr%放在帮助程序宏中,并使顶层宏仅包含对此帮助程序的未引用调用:
(defmacro helper (n es)
`(nth ,n ',es))
(defmacro nth-expr (n &rest …Run Code Online (Sandbox Code Playgroud)