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,我们完成了!忽略整个表达式的其余部分就容易多了。你为什么说正确的关联性有问题?他们都有相同的行为。