2012-02-29 40 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))))))) 

(這仍然不是如何這樣一個宏也被習慣寫的,但我試圖儘可能地反映您的版本)

相關問題