The*_*ire 6 scheme optional-parameters racket
所以,我试图看看可以接受任意数量的参数的函数是如何工作的?
我试过这个
(define (plus x . xs)
(if
(null? xs) x
(plus (+ x (car xs)) . (cdr xs))))
(plus 1 2 3 4)
Run Code Online (Sandbox Code Playgroud)
但似乎它实际上并没有将cdr应用于xs,而是在调试器中通过它时传递((2 3 4)).所以我尝试了这个
(define (plus* x . xs)
(if
(null? xs) x
(let ((h (car xs))
(t (crd xs)))
(plus* (+ x h) . t))))
Run Code Online (Sandbox Code Playgroud)
思考:"哈,我想看到你现在通过cdr",但我得到一个错误:"应用程序:错误的语法(非法使用`.')in :(加*(+ xh).t)"
到底是怎么回事?
(我可以通过以下方式获得加入工作的版本
(define (add . xs)
(foldl + 0 xs))
Run Code Online (Sandbox Code Playgroud)
甚至
(define (plus x . xs)
(if
(null? xs) x
(apply plus (cons (+ x (car xs)) (cdr xs)))))
Run Code Online (Sandbox Code Playgroud)
所以,添加不是问题,事情是多么有效.)
您的上一个版本是将数字列表作为输入传递的正确方法plus
- 您必须使用apply
这样做.(好吧,要么就是这样,要么就像你所做的那样避免整个事情foldl
.)在应用程序中使用点不是你认为它应该做的 - 它使程序读取不同.