2
(define test (lambda args 
  (if (= (length args) 1) (display (car args))
      (begin (display (car args))
      (test (cdr args))))))

我在网上寻找它并没有找到答案,我能够为我的 func 获得可变数量的参数,但是我如何不将它们作为单个列表传递给下一次迭代?

为了更清楚,如果我打电话:

(test (list 1 1) (list 2 2) (list 3 3))

我期待得到:

(1 1) (2 2) (3 3)

但我得到:

(1 1) ((2 2) (3 3))

提前致谢!

4

2 回答 2

2
(define (test . args)
  (if (= (length args) 1)
    (display (car args))
    (begin
      (display (car args))
      (apply test (cdr args)))))
于 2013-01-30T18:40:09.997 回答
2

args将是传递给的参数列表test。第一次传递三个列表时,这三个列表args的列表也是如此。递归地传递它(cdr args),它是最后两个列表的列表,所以现在args是一个包含具有最后两个列表的列表的列表。也就是说,args(((2 2) (3 3)))你想要((2 2) (3 3))的。您可以通过将test函数应用于列表来修复它:

(apply test (cdr args))

如果(cdr args)((2 2) (3 3)),则与执行以下操作相同:

(test (2 2) (3 3))
于 2013-01-30T18:47:53.013 回答