小编Knu*_*uto的帖子

有没有办法让宏在返回结果之前进行额外的评估?

我试图让我的宏在返回结果之前对其结果做额外的评估。可以不这样做eval吗?

我正在尝试解决以下练习4中的问题:

  1. 定义一个宏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)

macros common-lisp control-flow

5
推荐指数
1
解决办法
106
查看次数

标签 统计

common-lisp ×1

control-flow ×1

macros ×1