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

PeN*_*peL 1 compiler-construction scheme language-implementation expression-evaluation chez-scheme

我知道它将(begin expr1 expr2 ...)评估所有表达式并返回最后评估的表达式。

我发现在 Chez Scheme 中允许使用begin不带表达式的形式,如下所示:(begin)。我正在使用 Chez Scheme 作为我学习的一部分。当我在控制台中写入时,(begin)它不会发送语法错误,它只是显示任何内容,就好像我收到了void.

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

我以为这是你可以通过运行获得的 void 对象(void)。然而,当我测试它时,我意识到事实并非如此。

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

编辑:

我正在添加有关此主题的链接。我无法完全理解答案。另外,他没有提到返回类型。

new*_*cct 5

我认为这个问题混淆了 的不同用途begin。如果你看一下R6RS第 11.4.7 节begin,它有两种不同的使用方式:1) 具有 0 个或多个“形式”,在这种情况下,形式在语法上“拼接”到周围的主体中,就像没有begin一样那里(我相信这在编写宏时主要有用);2) 有 1 个或多个表达式,在这种情况下,它按顺序计算表达式并返回最后一个表达式的结果。

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

  • @PeNpeL:嗯,“开始”本身不是一个过程;它是一个过程。这是语言的一种特殊形式。但基本上,是的,“(begin)”不是“begin”表达式形式的使用,它本身也不是一个表达式。如果你的编译器不需要支持复杂的宏,也许你可以暂时忽略“begin”的形式拼接形式。 (2认同)