所以,我试图看看可以接受任意数量参数的函数是如何工作的?
我试过这个
(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”,但我得到一个错误:“应用程序:错误的语法(非法使用`。')in :(加*(+ xh)。 t)“
发生了什么事?
(我可以通过
获得一个额外的工作版本(define (add . xs)
(foldl + 0 xs))
甚至
(define (plus x . xs)
(if
(null? xs) x
(apply plus (cons (+ x (car xs)) (cdr xs)))))
所以,添加不是问题,事情是多么有效。)
答案 0 :(得分:7)
您的上一个版本是将数字列表作为输入传递给plus
的正确方法 - 您必须使用apply
来执行此操作。 (好吧,要么就是这样,要么像foldl
那样避免整个事情。)在应用程序中使用点不是你认为它应该做的 - 它会使程序以不同的方式读取。