我是Scheme的新手,我正试着通过阅读Structure and Interpretation of Computer Programs来熟悉这门语言。我对测序有点困惑。
首先,我了解引入begin
关键字以允许排序,因此需要对可变结构的操作更容易。我不明白的是,有时候他们会按照以下顺序进行测序(以SCIP第268页的例子为例):
(define (stuff-0)
(+ 1 2)
(+ 1 3)
'ok)
虽然可以使用begin
实现相同的内容:
(define (stuff-1)
(begin
(+ 1 2)
(+ 1 3)
'ok))
这两者之间是否有语义差异,或者第一个只是第二个的语法糖?
其次,除了实际重要性之外,理论上我们还需要begin
构造吗?我想,对于我们需要的每个序列,我们可以编写一系列实现序列的过程。当然这是不切实际的,但我只是对没有begin
结构的语言的表达感兴趣。
答案 0 :(得分:2)
这很简单:在一个程序中,总有一个隐式 begin
。所以这个:
(define (f x)
(begin
<expression 1>
<expression 2>
<returned value>))
......完全等同于此:
(define (f x)
<expression 1>
<expression 2>
<returned value>)
不,没有任何语义差异,上面的第二种形式只是第一种形式的语法糖。并且begin
形式是必要的,因为必须有一种方法来按照指定的顺序执行一系列表达式只是为了它们的效果。请记住:在begin
(或者就此而言,在一个过程中 - 它是相同的)所有表达式按它们出现的顺序执行,它们的结果值基本上被忽略,并且只返回最后一个表达式的值结束。
答案 1 :(得分:1)
每个define special from都包含一个隐含的begin子句。
对于新手来说,第二个例子更清晰,但对经验丰富的人来说只是噪音。
您需要一个begin构造的地方通常是if语句的then或else子句。您还需要在匿名函数中使用它。
答案 2 :(得分:1)
不需要明确的begin
。如果您需要对某些内容进行排序,但没有begin
,那么请执行以下操作:
((lambda () <body1> <body2> ...))
事实上,上面的确是如何将begin
实现为宏。以下是R7RS的语法定义:
(define-syntax begin
(syntax-rules ()
((begin exp ...)
((lambda () exp ...)))))
所以你的陈述“我知道引入begin
关键字以允许排序”并不是真的正确。在begin
的基本测序构建中引入lambda
作为语法糖。