Scheme 方案排序
我对Scheme还不熟悉,我正试图通过阅读来熟悉这门语言。我对排序有点困惑 首先,我知道引入Scheme 方案排序,scheme,syntactic-sugar,sequencing,Scheme,Syntactic Sugar,Sequencing,我对Scheme还不熟悉,我正试图通过阅读来熟悉这门语言。我对排序有点困惑 首先,我知道引入begin关键字是为了允许排序,这样就更容易对可变结构进行操作。我不明白的是,有时他们使用如下顺序(受SCIP第268页示例的启发): 虽然可以使用begin来实现这一点: (define (stuff-1) (begin (+ 1 2) (+ 1 3) 'ok)) 这两个词之间有语义上的区别吗?还是第一个词只是第二个词的一种句法上的糖分 第二,除了实际重要性之外,我们在理论
begin
关键字是为了允许排序,这样就更容易对可变结构进行操作。我不明白的是,有时他们使用如下顺序(受SCIP第268页示例的启发):
虽然可以使用begin
来实现这一点:
(define (stuff-1)
(begin
(+ 1 2)
(+ 1 3)
'ok))
这两个词之间有语义上的区别吗?还是第一个词只是第二个词的一种句法上的糖分
第二,除了实际重要性之外,我们在理论上是否需要
begin
结构?我设想,对于我们需要的每个序列,我们可以编写一系列实现该序列的过程。这当然是不切实际的,但我只是对没有begin
结构的语言的表达能力感兴趣。很简单:在一个过程中,总是有一个隐式的begin
。因此:
(define (f x)
(begin
<expression 1>
<expression 2>
<returned value>))
(定义(f x)
(开始
))
。。。完全等同于此:
(define (f x)
<expression 1>
<expression 2>
<returned value>)
(定义(f x)
)
不,没有任何语义上的区别,上面的第二种形式只是第一种形式的语法糖。而且
begin
表单是必需的,因为必须有一种方法来执行一系列表达式,以使它们按照指定的顺序生效。记住:在一个begin
(或者在一个过程中,它是相同的)中,所有的表达式都按照它们出现的顺序执行,它们的结果值基本上被忽略,只有最后一个表达式的值在最后返回。很简单:在一个过程中,总是有一个隐式的begin
。因此:
(define (f x)
(begin
<expression 1>
<expression 2>
<returned value>))
(定义(f x)
(开始
))
。。。完全等同于此:
(define (f x)
<expression 1>
<expression 2>
<returned value>)
(定义(f x)
)
不,没有任何语义上的区别,上面的第二种形式只是第一种形式的语法糖。而且
begin
表单是必需的,因为必须有一种方法来执行一系列表达式,以使它们按照指定的顺序生效。请记住:在一个begin
(或者在一个过程中,它是相同的)中,所有表达式都按照它们出现的顺序执行,它们的结果值基本上被忽略,只有最后一个表达式的值在末尾返回。每个define special from都包含一个隐式begin子句
对于新手来说,第二个例子更清楚,但对于有经验的人来说,这只是噪音
通常需要begin构造的一个地方是if语句的then或else子句。在匿名函数中也需要它 每个define special from都包含一个隐式begin子句 对于新手来说,第二个例子更清楚,但对于有经验的人来说,这只是噪音
通常需要begin构造的一个地方是if语句的then或else子句。在匿名函数中也需要它 不需要显式的
begin
。如果您需要对某些内容排序,但没有开始
,则可以执行以下操作:
((lambda () <body1> <body2> ...))
因此,您的陈述“我知道,
begin
关键字是为了允许排序而引入的”实际上并不正确begin
是在lambda
的基本排序结构上作为语法糖引入的,不需要显式的begin
。如果您需要对某些内容排序,但没有开始
,则可以执行以下操作:
((lambda () <body1> <body2> ...))
因此,您的陈述“我知道,
begin
关键字是为了允许排序而引入的”实际上并不正确begin
是作为语法糖介绍的lambda
的基本排序结构。您能详细说明一下您所说的begin
是必要的吗?你能给我举个例子吗,使用begin
绝对是唯一的方法。我的印象是,由于Scheme在主体之前评估过程的参数,所以我们可以通过级联过程模拟排序。例如:您将如何为此级联过程(define x 10)(define(f)(set!x(add1 x))x)(f)
请注意,begin
在f
过程中是隐式的,并且过程中的第一行产生效果,而不是值。首先,您必须定义级联
以接收数量可变的参数,asbegin
可以有任意数量的表达式。其次,它不起作用,因为过程参数的求值顺序是未定义的,begin
保证了其表达式的求值顺序。您的第一句话是:我知道这一点,这就是为什么begin
非常有用的原因。如果没有它,您将始终需要为特定问题编写特定的级联,但我现在将其放在一边。对于你的第二句话,Racket似乎是从左到右评估论点。第二句话:你不能指望它。它取决于实现。您能详细说明一下您所说的begin
是必要的吗?你能给我举个例子吗,使用begin
绝对是唯一的方法。我的印象是,由于Scheme在主体之前评估过程的参数,所以我们可以通过级联过程模拟排序。例如:您将如何为此级联过程(define x 10)(define(f)(set!x(add1 x))x)(f)
请注意,begin
在f
过程中是隐式的,并且过程中的第一行产生效果,而不是值。首先,您必须定义级联
以接收数量可变的参数,asbegin
可以有任意数量的表达式。第二,它不起作用,因为