Language design 是否有正确的关联短路运算符
我正在开发一个中断器,它可以定义自己的操作符。然后,目标是获取一个类似于Language design 是否有正确的关联短路运算符,language-design,short-circuiting,Language Design,Short Circuiting,我正在开发一个中断器,它可以定义自己的操作符。然后,目标是获取一个类似于exp op exp的AST,并根据两个运算符的相对优先级和关联性将其转换为exp op(exp op exp)或(exp op exp)op exp。该语言是动态的,因此知道要使用哪个版本的运算符的唯一方法是计算第一个表达式,并询问它要使用哪个版本的op 另一方面,重要的是我们不要计算第二个表达式,因为如果op是|(常用),那么如果第一个exp是false,我们应该能够短路 如果某个运算符同时正确关联和短路,则会出现问题我
exp op exp
的AST,并根据两个运算符的相对优先级和关联性将其转换为exp op(exp op exp)
或(exp op exp)op exp
。该语言是动态的,因此知道要使用哪个版本的运算符的唯一方法是计算第一个表达式,并询问它要使用哪个版本的op
另一方面,重要的是我们不要计算第二个表达式,因为如果op
是|
(常用),那么如果第一个exp
是false
,我们应该能够短路
如果某个运算符同时正确关联和短路,则会出现问题我的问题是,是否有任何常用的正确关联短路运算符(对于选定的“common”值)
注意:赋值由解析器单独处理,因此=
不是运算符,a(op)=b
是a=a op b
的语法糖
我可能会读
a → b → c
因为“a意味着b意味着c”,这意味着它应该用括号括起来
a → (b → c)
布尔蕴涵可能是短路,因为当a为false时,那么(a)的右侧→ b) 与结果无关。可能是
我可能会读
a → b → c
因为“a意味着b意味着c”,这意味着它应该用括号括起来
a → (b → c)
布尔蕴涵可能是短路,因为当a为false时,那么(a)的右侧→ b) 与结果无关。有趣!当它与右侧关联时,它与左侧短路,也就是说,
a
将始终被评估,但b
与c
分组,而不是a
。我仍然可以合法地评估a
以找到→
@JohnF.Miller,其他右关联运算符通常在定义良好的语言中从左到右求值。赋值通常是右关联的,但在JavaScript中,lhs在rhs之前求值:var x=42;变量y=[];(x=y)[0]=x代码>以与程序相同的状态结束vary=[];x=y[0]=y代码>。我相信Java也会这样做;Python不允许将赋值作为子表达式;C、C++和OCAML没有指定评价顺序,有趣!当它与右侧关联时,它与左侧短路,也就是说,a
将始终被评估,但b
与c
分组,而不是a
。我仍然可以合法地评估a
以找到→
@JohnF.Miller,其他右关联运算符通常在定义良好的语言中从左到右求值。赋值通常是右关联的,但在JavaScript中,lhs在rhs之前求值:var x=42;变量y=[];(x=y)[0]=x代码>以与程序相同的状态结束vary=[];x=y[0]=y代码>。我相信Java也会这样做;Python不允许将赋值作为子表达式;C、C++和OcAML没有指定评估顺序,实际上正确的结合性使其更有意义。尝试可视化a或b或c或d或e的解析树。当左关联和a
为真时,我们在树上走来走去,在顶部得到真。当右关联时,如果a
为真,ta da,我们完成了!忽略整个表达式的其余部分就容易多了。你为什么说正确的关联性有问题?他们都有相同的行为。事实上,正确的联想性更有意义。尝试可视化a或b或c或d或e的解析树。当左关联和a
为真时,我们在树上走来走去,在顶部得到真。当右关联时,如果a
为真,ta da,我们完成了!忽略整个表达式的其余部分就容易多了。你为什么说正确的关联性有问题?他们都有相同的行为。