"next" 在这种情况下是什么意思?

What does "next" mean in this context?

我正在阅读 SICP 并使用 Dr Racket SICP 包作为 IDE 和解释器。来自 SICP 的代码:

(define (sum func a next b)
  (if (> a b)
      0
      (+ (func a)
         (sum func (next a) next b))))
(define (inc n) (+ n 1))

(define (sum-cubes a b)
  (sum cube a inc b))

(define (cube a) (* a a a))

(sum-cubes 1 10)

函数是计算1到10的立方和。但是我不知道next b是什么意思,因为我们增加的是a而不是b,增量函数表示为inc.

所以我删除了 next b

中的 next

然后我得到了错误: define: duplicate argument identifier in: next

我试图在语法中查找 "next" 但一无所获。

我以某种方式完成了这项工作:

(define (sum func a b)
  (if (> a b)
      0
      (+ (func a)
         (sum func (inc a) b))))
(define (inc n) (+ n 1))

(define (sum-cubes a b)
  (sum cube a b))

(define (cube a) (* a a a))

(sum-cubes 1 10)

但这似乎很奇怪。 funccube 代替了,所以它很像 C++ 中的函数参数?但是怎么不是(func (inc a))呢? Scheme 怎么会识别出 func (inc a) 并且知道它需要用 cube 替换它呢?

next只是一个参数,恰好是一个函数。它传递了值 inc,因此函数 sum 中的片段 (next a) 正在计算 (inc a)。下面的 next b 只是将这些值传递给 sum.

的递归调用

加法

递归调用只是递增传递给 a 的值,并让 b 保持原样。 a > b 时递归停止。在每个级别 func 应用于 a 并添加到正在累积的值中。 func 是示例中的函数 cube。所以它按预期对多维数据集求和。

这种形式:

(+ a b)

是3个变量的组合。 +ab 是变量,Scheme 在应用程序之前以任何顺序评估它们,它采用过程对象和值。

知道用户定义过程中的参数变成变量是非常重要的。他们可以持有 任何值 所以 funcnext 只是名字。在代码中,您会看到它们正在被应用,例如。它们在运算符位置用括号括起来,这是唯一暗示它们应该是过程的提示。也就是说,除了评论中的文档:-)

在运算符位置以外的其他地方的过程只是一个被传递的值。例如。在 (sum func (next a) next b) 中很明显 next 是一个过程,它用于生成第二个参数并将其作为值传递。它在下一次迭代中绑定到 next,以便它也可以在那里使用。您实际上可以通过使用闭包来避免这种情况:

;;; sums the numbers a ... b
;;; using procedure func as key and
;;; procedure next to compute next value
;;; example:
;;; (sum (λ (v) (* v 2)) ; func
;;;      1               ; a
;;;      (λ (v) (+ v 2)) ; next
;;;      10)             ; b 
;;; => 50
;;; = (+ 2 6 10 14 18)
(define (sum func a next b)
  (define (helper a)
    (if (> a b)
        0
        (+ (func a)
           (helper (next a)))))
  (helper a))

比上面更清楚的方法是使用named let,你也可以引入一个累加器,使这个尾部递归,但我想你最终会通过本书来学习这个。