有人知道为什么以下会产生预期结果 - (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))
,这正是宏所看到的。
附言在 Scheme 中使用卫生宏会更好。下面是一个使用 syntax-case
的例子:
(define-syntax mult2
(lambda (stx)
(define (double x)
#`(* 2 #,x))
(syntax-case stx ()
((_ lst)
#`(list #,@(map double (syntax-e #'lst)))))))
(这仍然不是这样一个宏的惯用写法,但我试图尽可能接近地反射(reflect)你的版本。)
关于macros - 方案宏产生意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9503466/