【问题标题】:In Scheme, what is the returned value of `(begin)`?在 Scheme 中,`(begin)` 的返回值是多少?
【发布时间】:2018-05-07 07:28:35
【问题描述】:

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

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

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

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

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

编辑:

我正在添加关于这个主题的this link。 我无法完全理解答案。另外,他没有提到返回类型。

【问题讨论】:

  • 如果您正在实现编译器的一部分,您对语言形式含义的定义应该来自规范,而不是来自现有行为。对吗?

标签: compiler-construction scheme expression-evaluation language-implementation chez-scheme


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复。如果我理解正确,您是说使用不带表达式的 (begin) 不是过程,而是类似宏的工具,因此不会返回任何值,我可以在允许的情况下简单地使用它?
  • @PeNpeL:begin 本身不是一个程序;它是语言的一种特殊形式。但基本上,是的,(begin) 不是使用begin 的表达式形式,它本身也不是表达式。如果你的编译器不需要支持复杂的宏,或许你可以暂时忽略begin的拼接形​​式。
猜你喜欢
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多