我为LaTeX3编写了一个十进制浮点单元(纯宏......很难)。特别是,我必须决定如何解析x < y < z
。我看到三个选项:
将<
视为左关联二元运算符,因此x < y < z
等同于(x < y) < z
。这是C
的作用:-1 < 0 < 1
变为(-1 < 0) < 1
,因此1 < 1
变为0
。
将<
视为右关联二元运算符,因此x<y<z
等同于x < (y < z)
。我觉得这个选择没有优势。
遇到<
时,请提前了解更多比较运算符,并将x < y < z
视为等同于(x < y) && (y < z)
,其中y
只会被评估一次。这是大多数非程序员所期望的。很多LaTeX用户都是非程序员。
目前我正在使用第一个选项,但这似乎不太自然。我认为我可以实施第二种情况而不会产生太多开销。我应该吗?
由于这个问题是主观的,让我问一个客观的问题:主流语言选择选项3?我对a < b > c == d < e != f
等混合事物的细节很感兴趣。如果它们存在,我也会对其他选择感兴趣。
答案 0 :(得分:3)
简答:如果比较序列“指向同一方向”,并且不使用!=
时,则只能解析比较序列。
长答案:在Python中,3 > 2 > 1
的评估结果为True
。但是,我不得不说所使用的实现过于简单化,因为它允许使用像a < b > c == d < e != f
这样的表达式,这在我看来是荒谬的。表达式would be interpreted as (a < b) and (b > c) and (c == d) and (d < e) and (e != f)
。这是一个简单的规则,但因为它允许令人惊讶的结果,我不喜欢这种解释。
我提出了一个更可预测的选择:
考虑一个命题xAyBzCw
。如果这个命题是“敏感的”,则相当于xAy and yBz and zCw
。对于“敏感性”,有必要......
x
,y
,z
,w
)是同一组X
的一部分(或者它们的类型可以统一为),和A
上的关系(B
,C
,X
)为transitive binary relations,A
和B
,存在关系C
,xAy and yBz
暗示所有xCz
x
},y
,z
;这种关系也受到这些限制。关于最后一条规则,您希望能够说1 < 2 = a < 4
等同于1<2 and 2=a and a<4
,还有1<2 and 1<a and 1<4
。要说后者,您必须知道=
和<
的互动方式。
您不能在我的选项中使用!=
,因为它不具有传递性。但您也不能说1 < 3 > 2
,2 < 3 > 1
或1 < 3 > 1
,除非您的关系?
与1?2
,2?1
和1?1
(基本上,这将是一种关系允许任何一对)。
从句法角度来看:您希望将关系运算符视为特殊运算符(+
更像是一个函数运算符),类似于您的第三个选项。
答案 1 :(得分:2)
Python链接关系运算符。当您点击in
和is
时,这会变得很有趣,因为它们也被认为是关系型的。
>>> 1 < 2 in [True, False]
False
>>> 1 < 2 in [2, 4]
True
答案 2 :(得分:2)
J从右到左评估语句,以便:
3 > 2 > 1
成为第一个
2 > 1
哪个解析为true,表示为1,因此:
3 > 1
其中也解析为true,因此1.相反的运算符<
将导致false,而整个语句恰好为true。所以你没有进一步与J。
您的主要问题是您的初始陈述:
3 > 2 > 1
是
的人类简写(3 > 2) AND (2 > 1)
因此,虽然提前读书看起来很蹩脚,但它确实是代表性所需要的。当然,除非其他人已经说过,否则会有一些Python魔法。