Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 通过lambda在方案中制定程序_Scheme_Sicp - Fatal编程技术网

Scheme 通过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,

我正在学习“计算机程序的结构和解释”课程

在第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
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))))
您会看到它将其称为其代码的一部分