0

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

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

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

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

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

编辑:

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

4

1 回答 1

3

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

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

于 2017-11-26T23:02:24.480 回答