Scheme 方案排序

Scheme 方案排序,scheme,syntactic-sugar,sequencing,Scheme,Syntactic Sugar,Sequencing,我对Scheme还不熟悉,我正试图通过阅读来熟悉这门语言。我对排序有点困惑 首先,我知道引入begin关键字是为了允许排序,这样就更容易对可变结构进行操作。我不明白的是,有时他们使用如下顺序(受SCIP第268页示例的启发): 虽然可以使用begin来实现这一点: (define (stuff-1) (begin (+ 1 2) (+ 1 3) 'ok)) 这两个词之间有语义上的区别吗?还是第一个词只是第二个词的一种句法上的糖分 第二,除了实际重要性之外,我们在理论

我对Scheme还不熟悉,我正试图通过阅读来熟悉这门语言。我对排序有点困惑

首先,我知道引入
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
过程中是隐式的,并且过程中的第一行产生效果,而不是值。首先,您必须定义
级联
以接收数量可变的参数,as
begin
可以有任意数量的表达式。其次,它不起作用,因为过程参数的求值顺序是未定义的,
begin
保证了其表达式的求值顺序。您的第一句话是:我知道这一点,这就是为什么
begin
非常有用的原因。如果没有它,您将始终需要为特定问题编写特定的级联,但我现在将其放在一边。对于你的第二句话,Racket似乎是从左到右评估论点。第二句话:你不能指望它。它取决于实现。您能详细说明一下您所说的
begin
是必要的吗?你能给我举个例子吗,使用
begin
绝对是唯一的方法。我的印象是,由于Scheme在主体之前评估过程的参数,所以我们可以通过级联过程模拟排序。例如:您将如何为此级联过程
(define x 10)(define(f)(set!x(add1 x))x)(f)
请注意,
begin
f
过程中是隐式的,并且过程中的第一行产生效果,而不是值。首先,您必须定义
级联
以接收数量可变的参数,as
begin
可以有任意数量的表达式。第二,它不起作用,因为