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)))))
如此,除了是沒有問題的,事情怎麼點的工作。)
它代替什麼?如果不是那樣的話,人們如何使用點? – 2010-11-15 05:29:37
'(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
請注意,球拍有一個語法系統,可以區分兩者,並以不同的方式處理用這種'。。輸入的表達式 - 但是這樣做並沒有完成,因爲它會導致其他更大的混淆。的情況。 – 2010-11-15 07:51:07