Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.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 如何评估let表单?_Scheme_Evaluation_Let - Fatal编程技术网

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
的计算如下:

  • 创建一个本地环境,其中每个变量都绑定到相应绑定中表达式的求值结果
  • 按顺序计算主体中的表达式
  • 结果:主体中最后一个表达式的结果
首先,术语——变量绑定后的表达式统称为body,body中的每个表达式都是body表达式。例:

(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)