通过 lambda 在 Scheme 中创建过程

Make procedure in Scheme by lambda

我正在通过'计算机程序的结构和解释'学习 Scheme

第 1.3.2 章使用 lambda 构建过程

我是这样理解lambda的。

匹配 lambda 的值写在 lambda 的括号外。

<b>(</b>(lambda (x) (+ x 4) <b>4)</b> ; (x) 匹配到4、结果为8

但在SICP中,另一个示例代码是不同的。

密码是:

(define (sum x y) (+ x y))

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

(pi-sum 3 6)

我认为如果 (lambda (x) (/ 1.0 (* x (+ x 3)))) 想要匹配 alambdaa 必须用括号括起来。

但是在示例代码中,不要使用括号。

当我运行这段代码时,出现错误。

错误是这样的:

***'sum: expects only 2 arguments, but found 4'***

当我像这样使用更多括号时:

(define (sum x y) (+ x y))

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

(pi-sum 2 6) ; result is 10.1

代码是运行.

我对 SICP 的示例代码感到困惑。

lambda的原则是否正确?

如果我是对的,为什么SICP这么写?

说要用1.3.1的和。在第 77 页(实际上从 77 开始到 78 结束)它看起来像这样:

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

如您所见,它看起来与您的 sum 大不相同,后者只是将两个数字相加。您在 pi-sum:

中也有错字
(define (pi-sum a b)
  (sum (lambda (x) (/ 1.0 (* x (+ x 2)))) ; multiplied by 2, not 3!
       a
       (lambda (x) (+ x 4))
       b))

(* 8 (pi-sum 1 1000))
; ==> 3.139592655589783

所以这里的重点是您可以传递 lambda 而不是命名过程。由于 (define (name . args) body ...) 只是 (define name (lambda args body ...)) 的语法糖,因此传递 (lambda args body ...) 而不是定义它并传递名称只是一种等同的重构。

变量 (+) 或 lambda ((lambda args body ...)) 周围的圆括号调用运算符表达式求值的任何过程。这不是您想要的,因为您传递了 sum 使用的过程作为抽象。 sum 可以根据您传递的内容进行乘法或任意数量的操作。在 sum term 中是过程 (lambda (x) (/ 1.0 (* x (+ x 2)))) 并且您看到它调用它作为其代码的一部分。