2012-09-22 53 views
0

爲了理解Scheme宏如何工作,我試圖定義一個新命令sum,其工作方式與普通的operator +(即未定義的參數數量)完全相同。方案宏擴展中的語法錯誤

我wroter此代碼:

(define-syntax sum 
    (syntax-rules() 
    ((_ arg1 arg2 args...) 
    (sum (+ arg1 arg2) args...)) 
    ((_ arg1 arg2) 
    (+ arg1 arg2)) 
    ((_ arg1) 
    arg1))) 

它的工作原理,如果我通過它1,2或3個參數。但隨着4個參數我得到這個錯誤:

sum: bad syntax in: (sum 1 2 3 4) 

我試圖擴大宏觀一步一步與DrRacket但它立即停止。

有人可以解釋我造成這個錯誤的原因嗎?

回答

2

在流程,...只是另一種標識,所以你需要在這兩個地方的省略號(...args之間的空間,這樣的:

(define-syntax sum 
    (syntax-rules() 
    ((_ arg1 arg2 args ...) 
    (sum (+ arg1 arg2) args ...)) 
    ___etc___)) 

BTW,你不需要創建宏以接受任意數量的參數。你也可以使用「rest args」:

(define (sum . args) 
    ;; args is bound to a list of all the arguments 
    (foldl + 0 args)) 
+0

當然肯定我知道關於參數..我只是想弄清楚宏是如何工作的。 – Aslan986