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