macros - 方案宏产生意外结果

标签 macros scheme racket

有人知道为什么以下会产生预期结果 - (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/

相关文章:

racket - Define 相对于 Let 的优点

c#define 宏字符串连接

macros - SPSS宏命令

c - 为什么 gcc 不提示缺少符号?

lisp - Scheme 中是否有等同于 Lisp 的 "runtime"原语?

c - PLT Racket 中的 FFI 与 openCV

javascript - Sweet.js - 如何将变量放入标识符名称和字符串变量中?

lisp - SICP、方案、DrRacket 问题 : Timer/profiler function?

混淆 Let 和 Let* 的方案

scheme - Scheme 符号区分大小写