通过 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))))
想要匹配 a
,lambda
和 a
必须用括号括起来。
但是在示例代码中,不要使用括号。
当我运行这段代码时,出现错误。
错误是这样的:
***'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))))
并且您看到它调用它作为其代码的一部分。
我正在通过'计算机程序的结构和解释'学习 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))))
想要匹配 a
,lambda
和 a
必须用括号括起来。
但是在示例代码中,不要使用括号。
当我运行这段代码时,出现错误。
错误是这样的:
***'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))))
并且您看到它调用它作为其代码的一部分。