Scheme 通过lambda在方案中制定程序
我正在学习“计算机程序的结构和解释”课程 在第1.3.2章中,使用lambda构建程序 我是这样理解拉姆达的 匹配lambda的值写在lambda的括号外Scheme 通过lambda在方案中制定程序,scheme,sicp,Scheme,Sicp,我正在学习“计算机程序的结构和解释”课程 在第1.3.2章中,使用lambda构建程序 我是这样理解拉姆达的 匹配lambda的值写在lambda的括号外 ((λ(x)(+x4)4);(x)与4匹配,结果为8 但在SICP中,另一个示例代码是不同的 代码是: (定义(和x y)(+x y)) (定义(pi和a b) (总和(λ(x)(/1.0(*x(+x 3))) A. (λ(x)(+x4)) B )) (pi和3 6) 我认为如果(lambda(x)(/1.0(*x(+x3)))想要匹配a,
((λ(x)(+x4)4);(x)与4匹配,结果为8
但在SICP中,另一个示例代码是不同的
代码是:
(定义(和x y)(+x y))
(定义(pi和a b)
(总和(λ(x)(/1.0(*x(+x 3)))
A.
(λ(x)(+x4))
B
))
(pi和3 6)
我认为如果(lambda(x)(/1.0(*x(+x3)))
想要匹配a
,lambda
和a
必须用括号绑定
但在示例代码中,不要使用括号
当我运行这段代码时,会发生错误
错误是:
***'sum: expects only 2 arguments, but found 4'***
当我使用更多这样的括号时:
(定义(和x y)(+x y))
(定义(pi和a b)
(总和((λ(x)(/1.0(*x(+x 3)))
(a)
((λ(x)(+x4))
(b)
))
(pi和2 6);结果为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))))
正如您所看到的,它看起来与您的仅将两个数字相加的总和
大不相同。您在pi总和
中也有一个打字错误:
(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
中的术语是过程(lambda(x)(/1.0(*x(+x2))))
您会看到它将其称为其代码的一部分