4

我有以下可变参数函数(define doSomething (lambda (x . rest) ...。通过使用数字调用该函数,例如:((doSomething 1 2 3 4 5)因此该调用x将是1并且rest将是(2 3 4 5))。

当我尝试递归调用该函数并将第二个数字 ( 2)xrestas 时,(3 4 5)我以某种方式接收rest参数作为 list: 的列表((3 4 5))

这就是我目前尝试再次调用该函数的方式: (+ x (doSomething (car rest) (cdr rest)))

值得一提的是,我正在使用Pretty Big. 请指教,谢谢。

4

1 回答 1

2

因此,在您的第一次通话中,您可以混合和匹配其余的内容

(doSomething 1 2 3 4 5)   ; x = 1  rest = '(2 3 4 5)

在您随后的通话中,您最终会得到

(doSomething (car rest) (cdr rest))   ; x=2  rest = '((3 4 5))

因为rest是一个可变参数,所以它会在第一个参数之后获取所有内容,并使其成为一个rest为您调用的列表,因此是双重列表。您可能想要使用apply或其他东西,例如:

(define doSomething (lambda (x . rest) 
                      (display x) 
                      (if (not (null? rest))
                        (apply doSomething rest)
                        #f)))
于 2012-10-30T13:28:02.310 回答