2010-11-15 18 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