有人知道为什么以下代码会产生预期的结果-(2 4 6)
(defmacro mult2 (lst)
(define (itter x)
(list '* 2 x))
`(list ,@(map itter lst)))
(mult2 (1 2 3))
而我希望这个会(带有列表标识符)
(defmacro mult2 (lst)
(define (itter x)
(list '* 2 x))
`(list ,@(map itter lst)))
(mult2 '(1 2 3))
最佳答案
这是因为读者将'(1 2 3)
扩展为(quote (1 2 3))
。由于您仅在宏中解构了一个列表,因此无法按预期工作。
一些常规建议:如果您在Racket中工作,则可能要避免使用defmacro
。那绝对不是写宏的惯用方式。看一下syntax-rules,如果要定义更复杂的宏,请看syntax-parse。 Eli还写了一个article来解释习惯于进行defmacro的人们的语法情况。