Scheme 如何评估let表单?
Scheme 如何评估let表单?,scheme,evaluation,let,Scheme,Evaluation,Let,let-允许表单中包含多个表达式: (let ((x 4)) x (+ x 1)) 返回5 这个表达式是如何计算的?它被称为隐式的begin,换句话说,您的代码的计算方式就像它是编写的一样: (let ((x 4)) (begin x (+ x 1))) 您描述的情况在Scheme中有几个部分,而不仅仅是在let表达式中。在下面 在let表达式中的变量绑定列表之后 在lambda表达式中的参数列表之后(因此,在过程定义中的参数列表之后) 在cond表达式中的每个子句之后 。。。
let
-允许表单中包含多个表达式:
(let ((x 4))
x
(+ x 1))
返回5
这个表达式是如何计算的?它被称为隐式的
begin
,换句话说,您的代码的计算方式就像它是编写的一样:
(let ((x 4)) (begin x (+ x 1)))
您描述的情况在Scheme中有几个部分,而不仅仅是在
let
表达式中。在下面
- 在
表达式中的变量绑定列表之后let
- 在
表达式中的参数列表之后(因此,在过程定义中的参数列表之后)lambda
- 在
表达式中的每个子句之后cond
begin
特殊形式中,求值顺序是从左到右,所有表达式依次求值,但返回的值是最后一个表达式的值
例如,此表达式:
(cond ((= 1 1) 1 2 3))
相当于:
(cond ((= 1 1) (begin 1 2 3)))
在这两种情况下,返回的值都是
3
,因为这是列表中最后一个表达式的值。好吧,让我们把术语弄清楚以防万一。let
表单有两部分:绑定和主体:
(let()
)
绑定的形式为()
,主体是一系列表达式。let
的计算如下:
- 创建一个本地环境,其中每个变量都绑定到相应绑定中表达式的求值结果
- 按顺序计算主体中的表达式
- 结果:主体中最后一个表达式的结果
(let ((variable-1 value-1)
(variable-2 value-2))
body-expression-1
body-expression-2)
正文表达式被包装在begin
中--(let((x2))x(+x1))
与(let((x2))(begin x(+x1))相同
计算begin
中的每个主体表达式,并将最终表达式的返回值用作整个主体的返回值。例如:(begin(+x1)(+x2))
将计算(+x1)
和(+x2)
,然后返回计算结果(+x2)
如果begin
中的每个主体表达式都没有副作用,则可以删除除最后一个主体表达式之外的所有主体表达式,而不会更改程序的运行时行为。这里唯一的例外是当一个初步的主体表达式运行缓慢/不返回/出错时——删除主体表达式可以消除问题,这是对程序运行时行为的更改
但是,当使用具有副作用的函数时,调用一个或多个函数以获取其副作用,然后返回值的功能非常有用
(let ((variable-1 value-1)
(variable-2 value-2))
body-expression-1
body-expression-2)