Compiler construction 在Scheme中,`(begin)`的返回值是多少?

Compiler construction 在Scheme中,`(begin)`的返回值是多少?,compiler-construction,scheme,expression-evaluation,language-implementation,chez-scheme,Compiler Construction,Scheme,Expression Evaluation,Language Implementation,Chez Scheme,我知道(begin expr1 expr2…将计算所有表达式并返回最后一个计算的表达式 我发现在Chez方案中,允许使用begin而不使用这样的表达式:(begin)。我把Chez计划作为我学习的一部分。当我在控制台中写入(begin)时,它不会发送语法错误,它只是不显示任何内容,就好像我正在获取void 我的问题是,到时会返回什么? 我认为通过运行(void)可以获得void对象。 然而,当我测试它时,我意识到它不是 我正在学习Chez Scheme,这是我正在学习的编译器课程的一部分,我需要

我知道
(begin expr1 expr2…
将计算所有表达式并返回最后一个计算的表达式

我发现在Chez方案中,允许使用
begin
而不使用这样的表达式:
(begin)
。我把Chez计划作为我学习的一部分。当我在控制台中写入
(begin)
时,它不会发送语法错误,它只是不显示任何内容,就好像我正在获取
void

我的问题是,到时会返回什么?

我认为通过运行
(void)
可以获得void对象。 然而,当我测试它时,我意识到它不是

我正在学习Chez Scheme,这是我正在学习的编译器课程的一部分,我需要实现编译器的一部分,它可以处理特殊的单词
begin
。所以我需要知道为什么这是可能的,这个函数返回什么

编辑:

关于这个话题,我要补充一点。
我不能完全理解答案。另外,他没有提到返回类型。

我认为问题是混淆了
begin
的不同用法。如果你看一下关于
begin
,它有两种不同的用法:1)与0个或更多的“表单”一起使用,在这种情况下,表单在语法上“拼接”到周围的实体中,就像
begin
不存在一样(我相信这在编写宏时非常有用);2)使用1个或多个表达式,在这种情况下,它按顺序计算表达式并返回最后一个表达式的结果


当您谈论“返回值”时,您谈论的是作为一个表达式的
(begin…
,但作为一个表达式(上文
begin
的第二种形式),它必须采用一个或多个表达式。空的
(begin)
必须是
begin
的第一种形式,它只是将“无”(0种形式)拼接到周围的身体中,但它不是与身体整体的评估分开“评估”的。

我认为这个问题混淆了
begin
的不同用法。如果你看一下关于
begin
,它有两种不同的用法:1)与0个或更多的“表单”一起使用,在这种情况下,表单在语法上“拼接”到周围的实体中,就像
begin
不存在一样(我相信这在编写宏时非常有用);2)使用1个或多个表达式,在这种情况下,它按顺序计算表达式并返回最后一个表达式的结果


当您谈论“返回值”时,您谈论的是作为一个表达式的
(begin…
,但作为一个表达式(上文
begin
的第二种形式),它必须采用一个或多个表达式。空的
(begin)
必须是
begin
的第一种形式,它只是将“nothing”(0种形式)拼接到周围的主体中,但它不是与整体主体的评估分开“评估”的。

如果您正在实现编译器的一部分,您对语言形式含义的定义应该来自规范,而不是现有的行为。对吗?如果您正在实现编译器的一部分,那么您对语言形式含义的定义应该来自规范,而不是现有的行为。对吧?谢谢你的回复。如果我理解正确,你是说不带表达式的(begin)的使用不是一个过程,而是一个类似宏的工具,因此不会返回任何值,我可以在允许的情况下使用它?@PeNpeL:Well
begin
本身不是一个过程;这是一种特殊的语言形式。但是基本上,是的,
(begin)
不是使用
begin
的表达式形式,它本身也不是一个表达式。如果你的编译器不需要支持复杂的宏,也许你现在可以忽略
begin
的表单拼接表单。谢谢你的回答!谢谢你的回复。如果我理解正确,你是说不带表达式的(begin)的使用不是一个过程,而是一个类似宏的工具,因此不会返回任何值,我可以在允许的情况下使用它?@PeNpeL:Well
begin
本身不是一个过程;这是一种特殊的语言形式。但是基本上,是的,
(begin)
不是使用
begin
的表达式形式,它本身也不是一个表达式。如果你的编译器不需要支持复杂的宏,也许你现在可以忽略
begin
的表单拼接表单。谢谢你的回答!