【发布时间】:2015-05-01 10:05:26
【问题描述】:
我编写了一个按预期工作的宏。问题是它包含一个eval。我想摆脱它,但尽我所能,我找不到正确的反引号和逗号组合。
(defmacro mymacro (x &body body)
`(myothermacro ,(fun1 (eval x))
,@body))
这里myothermacro是一个宏,fun1是一个函数。
这是所需的行为:
(defvar v 88)
(defun fun1 (z) (1+ z))
(defmacro mymacro (x &body body)
`(myothermacro ,(fun1 (eval x))
,@body))
(macroexpand-1 '(mymacro v 42 43 44))
=> (MYOTHERMACRO 89 42 43 44)
【问题讨论】:
-
也许您想告诉我们您真正想要实现的目标。您的代码看起来毫无用处 - 不清楚它的用途。
-
那是无益的评论。该代码准确地显示了我想要实现的目标。我想实现一个以与 mymacro 完全相同的方式扩展但不使用 eval 的宏。如果您不明白这一点,请说出不清楚的地方,而不是认为它没用。
-
为什么要在宏扩展期间进行评估?你的例子没有说清楚。用例是什么?你想达到什么(不是你想做的)?这一切的目的是什么?
(MYOTHERMACRO 89 42 43 44)和(MYOTHERMACRO v 42 43 44)之间几乎没有区别。您已将变量替换为宏扩展时间值。这对你的影响很小。
标签: macros common-lisp eval