在 JavaScript 中,
f = function(x) {
return x + 1;
}
(5)
乍一看好像应该分配f
后继函数,但实际上分配了值 6,因为解析器将括号后面的 lambda 表达式解释为后缀表达式,特别是函数调用。幸运的是,这很容易解决:
f = function(x) {
return x + 1;
};
(5)
表现如预期。
如果 Python 允许在 lambda 表达式中使用块,则会出现类似的问题:
f = lambda(x):
return x + 1
(5)
但是这次我们不能用同样的方法解决它,因为没有分号。在实践中,Python 通过不允许多行 lambda 表达式来避免这个问题,但我正在研究一种具有基于缩进的语法的语言,我确实需要多行 lambda 和其他表达式,所以我试图弄清楚如何避免出现块解析为后缀表达式的开头。到目前为止,我在想也许递归下降解析器的每个级别都应该有一个参数,类似于“我们已经在这个语句中吃掉了一个块,所以不要做后缀”。
是否有任何现有的语言遇到此问题,如果有,他们如何解决?