2010-11-15 45 views
5

所以,我想看看如何可以接受任意數量的參數的函數工作?方案中的可選參數和點

我想這

(define (plus x . xs) 
    (if 
    (null? xs) x 
    (plus (+ x (car xs)) . (cdr xs)))) 
(plus 1 2 3 4) 

但似乎是,這是不實際應用到CDR XS,但傳遞((2 3 4))時,我通過它在調試器階梯。所以,我想這個

(define (plus* x . xs) 
    (if 
    (null? xs) x 
    (let ((h (car xs)) 
     (t (crd xs)))    
    (plus* (+ x h) . t)))) 

思考:「哈哈,我倒要看看你通過CDR在現在」,但我得到一個錯誤:「應用程序:語法錯誤(非法使用`')中: (加*(+ xh)。t)「

這是怎麼回事?

(我可以得到一個版本,除了工作,無論是

(define (add . xs) 
    (foldl + 0 xs)) 

甚至

(define (plus x . xs) 
    (if 
    (null? xs) x 
    (apply plus (cons (+ x (car xs)) (cdr xs))))) 

如此,除了是沒有問題的,事情怎麼點的工作。)

回答

6

您的上一個版本是將數字列表作爲plus的輸入的正確方式 - 您必須使用使用apply來做到這一點。 (好吧,要麼就是要避免整個事情,就像你用foldl所做的那樣。)在應用程序中使用點並不是做你認爲它應該做的事 - 它使程序讀取的方式不同。

+0

它代替什麼?如果不是那樣的話,人們如何使用點? – 2010-11-15 05:29:37

+3

'(x。y)'被讀爲一個cons單元,其'car'中的x'和cdr中的'y' - 也就是說,它不是一個正確的列表。類似地,'(x。(y))'是一個在'car'中帶有'x'的cons單元,在'cdr'中帶有'(y)'的列表 - 所以它和讀取'(xy) '。所以當你寫'(加x。(cdr t))'時,就像你寫了'(加上x cdr t)'一樣,這就解釋了你得到的令人困惑的結果。 – 2010-11-15 07:50:17

+0

請注意,球拍有一個語法系統,可以區分兩者,並以不同的方式處理用這種'。。輸入的表達式 - 但是這樣做並沒有完成,因爲它會導致其他更大的混淆。的情況。 – 2010-11-15 07:51:07