从函数返回值和语句
Returning values and statements from functions
我想知道使用 return
语句和使用模式 foo() = Expression
定义函数之间的行为差异
我的理解是:Funtions 一个函数体可以是 = Expression
而 return
要么什么都不带,要么带一个 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语句的语法定义
在未来的版本中,我们可能会取消所有限制并允许在任何地方声明。
我想知道使用 return
语句和使用模式 foo() = Expression
我的理解是:Funtions 一个函数体可以是 = Expression
而 return
要么什么都不带,要么带一个 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语句的语法定义在未来的版本中,我们可能会取消所有限制并允许在任何地方声明。