有人知道为什么以下代码会产生预期的结果-(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的人们的语法情况。

10-08 08:28