【发布时间】:2013-09-19 05:11:02
【问题描述】:
我想要一个宏my-macro,它可以扩展为1 2 3,而不是(1 2 3),这样
(list (my-macro) 4 5) -> (1 2 3 4 5)
这可能吗?
【问题讨论】:
-
我非常确信不是,因为要爆炸你通常使用@的列表,但这需要它在列表内才能爆炸。我找不到任何明确说明这一点的参考资料。如果你心里有一个特定的问题想用这个问题来解决,你可能想发布那个。
-
@Sim 我想将宏扩展为函数调用的参数。现在我必须使用
(apply #'foo (append (my-macro) (list 4 5)))而不是(foo (my-macro) 4 5)。后者更加简单明了。 -
@Sim 看来读宏不能做到这一点,对吧?
-
@wvxvw
apply将接受与您提供的参数一样多的参数,并且 last 必须是一个列表。所以你可以做(apply 'frob bar1 bar2 (list bar3 bar4)),它和(frob bar1 bar2 bar3 bar4)一样,但是通过同样的过程,(apply 'frob (list bar1 bar2) (list bar3 bar4))相当于(frob (list bar1 bar2) bar3 bar4)。 SaltyEgg 仍然需要附加参数列表。 -
@SaltyEgg 使用 apply,实际上更清楚,因为每个人都知道它的作用,而不是你的(实际上不可能的)宏。 lispworks.com/documentation/HyperSpec/Body/f_apply.htm#apply
标签: macros common-lisp