从函数返回值和语句

Returning values and statements from functions

我想知道使用 return 语句和使用模式 foo() = Expression

定义函数之间的行为差​​异

我的理解是:Funtions 一个函数体可以是 = Expressionreturn 要么什么都不带,要么带一个 Expression

我问的原因是,根据我对文档的理解,以下内容不可行:

map[int,int] foo(map[int,int] env) = env[0] = 1;

它不会(导致解析错误),因为赋值是 Statement。但是,如果我稍微修改一下这个函数:

map[int,int] foo(map[int,int] env) { return env[0] = 1; }

这似乎有效。我很困惑,因为我虽然 return 应该只接受表达式。此外,从 REPL 上的游戏来看,这个赋值 return 是一个 Value,所以能够定义赋值和 return 修改后的映射的函数会很好。

也许我在这里遗漏了一些东西。

你的理解没问题。 return 语句具有一些额外的灵活性,尽管显然也允许 returning 选定语句类型(例如 'for' 和赋值)产生的值。参见Rascal文法here

中return语句的语法定义

在未来的版本中,我们可能会取消所有限制并允许在任何地方声明。