计划可变函数以添加数字

Scheme variadic function to add numbers

我有这个代码

(define mysum
    (lambda (l)
        (if (null? l)
            0
            (+ (car l) (mysum (cdr l))))))

哪个有效:

(mysum '(1 2 3))

给出 6,但是这个

(define (my+func . numbers)
  (lambda (num)
    (if (null? num)
        0
        (+ (car num) (my+func (cdr num))))) numbers)

不工作。毫无疑问,我在尝试在 lambda 中进行递归时迷路了。有什么想法吗?

所以有两种方法可以制作程序。你有这个:

(define name (lambda (arg ...) body ...))

还有等价的语法糖:

(define (name arg ...) body ...))

如果你愿意,你可以用你最后的程序做相反的过程:

(define my+func 
  (lambda numbers
    (lambda (num) 
      (if (null? num)
          0
          (+ (car num) (my+func (cdr num)))))
    numbers))

当您执行 (my+func 1 2 3) 时,它会创建一个接受一个参数的过程。由于该过程不是最后一个表达式,因此它被丢弃并丢弃,最后一个表达式是 numbers。因此你会得到 (1 2 3) 作为结果。

这可行:

(define my+func 
  (lambda numbers
    (if (null? numbers)
        0
        (+ (car numbers) (apply my+func (cdr numbers))))))

可以翻译回加糖的define:

(define (my+func . numbers) 
  (if (null? numbers)
      0
      (+ (car numbers) (apply my+func (cdr numbers)))))

注意 apply。这是因为您不能将 (my+func '(2 3)) 作为递归发送,但它必须是 (my+func 2 3),这就是 apply 所做的。或者,您可以制作一个使用列表的助手:

(define (my+func . numbers) 
  (define (helper ns)
    (if (null? ns)
        0
        (+ (car ns) (helper (cdr ns)))))
  (helper numbers))

通常人们会为助手中的数字选择相同的名称,但我记得我对不相同的阴影变量感到困惑。