方案:可能是 SICP 中的拼写错误。 1.3.2.我对吗?

Scheme: Proabably a typo in SICP. 1.3.2. Am I right?

在 SICP 中,(1.3.2. page: 62),有一个使用 lambda 查找 pi-sum 的解决方案。解决方案是:

(define (pi-sum a b)
  (sum (lambda (x) (/ 1.0 (* x (+ x 2))))
       a
       (lambda (x) (+ x 4))
       b))

不过,我觉得应该有一个括起来的括号((lambda (x) (+ x 4) b)。这样的程序会产生一个错误,说 sum 期待 number 但得到 procedure.

修改上面的代码没有报错。

(define (pi-sum a b)
  (sum ((lambda (x) (/ 1.0 (* x (+ x 2))))
       a)
       ((lambda (x) (+ x 4))
       b)))

如果我的理解有误,请指正。我想这本书不会错的。

本书中的 pi-sum 过程使用了早先在 1.3.1 中定义的 higher-order 过程 sumsum 过程以 ab 作为描述求和范围的参数,并以 termnext 作为描述如何创建的参数a 中的术语,以及如何从当前 a 中获取下一个 atermnext都需要程序。这是书中sum的定义:

(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a)
         (sum term (next a) next b))))

如果你在 pi-sum 的定义中添加括号,你应该得到一个异常,因为 sum 需要四个参数,但现在只传递了两个。我不确定你为什么会收到类似“sum 期待 number 但得到 procedure” 的错误,但我怀疑你sum 的定义与书中的定义不同。