【问题标题】:Are there any right associative short-circuit operators有没有右结合短路算子
【发布时间】:2024-04-19 09:55:01
【问题描述】:

我正在开发一种中断器,可以让人们定义自己的运算符。然后目标是采用看起来像exp op exp op exp 的AST,并根据两个运算符的相对优先级和关联性将其转换为exp op (exp op exp)(exp op exp) op exp。该语言是动态的,因此知道要使用哪个版本的运算符的唯一方法是评估第一个表达式并询问它要使用哪个版本的 op

另一方面,重要的是我们不要评估第二个表达式,因为如果op||(如常用),那么如果第一个exp 是@987654328,我们应该能够短路@。

如果某些运算符既是右结合又是短路的,就会出现问题。 我的问题是,是否有任何常用的右结合、短路运算符(对于选定的“common”值)?

注意分配由解析器单独处理,因此= 不是运算符,a (op)= ba = a op b 的语法糖。

【问题讨论】:

  • 实际上,正确的关联性更有意义。尝试可视化a or b or c or d or e 的解析树。当left-associative 和a 为真时,我们会在树的顶部向上、向上和向上走,以在顶部为真。当右关联时,如果a 为真,ta-da,我们就完成了!忽略整个表达式的其余部分要容易得多。你为什么说右结合有问题?恕我直言,他们都有相同的行为。

标签: language-design short-circuiting


【解决方案1】:

Boolean implication 可能是。

我可能会读

a → b → c

因为“a 暗示 b 暗示 c”,这表明它应该用括号括起来

a → (b → c)

并且布尔含义可能应该是短路的,因为当 a 为假时,(a → b) 的右侧与结果无关。

【讨论】:

  • 有趣!虽然它与右侧关联,但它与 left 短路,即始终会评估 a,但 bc 而不是 a 分组。我仍然可以合法地评估a 以找到 的含义。
  • @JohnF.Miller,其他右关联运算符通常在定义明确的语言中从左到右进行计算。赋值通常是右关联的,但在 JavaScript 中,lhs 在 rhs 之前计算:var x = 42; var y = []; (x = y)[0] = x; 以与程序 var y = []; x = y[0] = y; 相同的状态结束。我相信 Java 也是如此。 Python 不允许赋值作为子表达式;而 C、C++ 和 OCaml 不指定评估顺序。