方案中的可选参数和点

时间:2010-11-15 04:18:40

标签: scheme racket optional-parameters

所以,我试图看看可以接受任意数量参数的函数是如何工作的?

我试过这个

(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)))))

所以,添加不是问题,事情是多么有效。)

1 个答案:

答案 0 :(得分:7)

您的上一个版本是将数字列表作为输入传递给plus的正确方法 - 您必须使用apply来执行此操作。 (好吧,要么就是这样,要么像foldl那样避免整个事情。)在应用程序中使用点不是你认为它应该做的 - 它会使程序以不同的方式读取。