【发布时间】:2021-07-04 06:48:43
【问题描述】:
以下 with-gensyms 的实现,旨在对类似 let 的参数列表进行操作,在嵌套的 let 中生成一个额外的逗号:
(defmacro with-gensyms (vars &rest forms)
`(let ,(loop for var in vars
collect (if (listp var)
`(,(car var) (gensym))
`(,var (gensym))))
`(let ,,(loop for genvar in vars
collect (if (listp genvar)
`(,(car genvar) ,(car (cdr genvar)))
`(,genvar nil)))
,,@forms)))
宏展开示例:
(with-gensyms ((var1 1) (var2 2) (testvar "testname") the-number-zero))
(LET ((VAR1 (GENSYM))
(VAR2 (GENSYM))
(TESTVAR (GENSYM))
(THE-NUMBER-ZERO (GENSYM)))
`(LET ,((VAR1 1) (VAR2 2) (TESTVAR "testname") (THE-NUMBER-ZERO NIL))))
在嵌套 let 的参数列表之前有一个额外的逗号,我不清楚为什么会这样。
目标输出如下:
(let ((var1 (gensym)) (var2 (gensym)) (testvar (gensym)) (the-number-zero (gensym)))
`(let ((,var1 1) (,var2 2) (,testvar "testname") (,the-number-zero nil))))
任何帮助都会很好!
【问题讨论】:
-
反引号用作引号。文字紧随其后。不要处理这些...逗号取消引用,以便可以重新开始评估。 stackoverflow.com/questions/6474777/… - stackoverflow.com/questions/18515295/… - 额外的逗号是因为它必须取消引用这两个。它们也包含在第一个括号中。
-
我明白你想要做什么,但这很难。我认为更紧迫的问题是 e 之前没有 no 逗号。 G。
var1在内部绑定中。您需要在此处引用生成的外部绑定符号,但没有明确的方法可以做到这一点,尽管我可能忽略了一些东西。 -
是的,问题是您在宏扩展时没有生成的符号。你需要摒弃生成生成代码的想法,而是直接进行。
标签: common-lisp