2012-02-29 130 views
2

是否有人知道为什么下面会产生预期的结果 - (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)) 

回答

3

这是因为'(1 2 3)被扩大读者到(quote (1 2 3))。由于您只在宏中解构了一个列表,因此无法按预期工作。

一些一般建议:如果你在Racket工作,你可能想避免使用defmacro。这绝对不是编写宏的惯用方式。看看syntax-rules,如果你想定义更复杂的宏,syntax-parse。 Eli还写了一个article解释用于defmacro的人的语法情况。

+1

非常感谢!你确实救了我几个小时。 – user1240792 2012-02-29 18:06:43

4

宏“参数”不被评估。所以,当你通过'(1 2 3),即(quote (1 2 3)),这正是宏观看到的。

P.S.在Scheme中使用卫生宏会更好。下面是使用syntax-case一个例子:

(define-syntax mult2 
    (lambda (stx) 
    (define (double x) 
     #`(* 2 #,x)) 
    (syntax-case stx() 
     ((_ lst) 
     #`(list #,@(map double (syntax-e #'lst))))))) 

(这仍然不是如何这样一个宏也被习惯写的,但我试图尽可能地反映您的版本)

相关问题