2012-08-23 66 views
0

我已经为LaTeX3写了一个十进制浮点数单元(纯粹的宏...很难)。特别是,我必须决定如何解析x < y < z。我看到三个选项:3> 2> 1为真的语言

  • 款待<为左结合二元运算符,所以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等混合事件发生的细节感兴趣。如果它们存在,我也对其他选择感兴趣。

回答

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。对于“感性”,有必要......

    • 值(xyzw)是相同的组X(或它们的类型可以统一为例如)的一部分,并且
    • 的关系(ABC)是transitivebinary relationsX,并且
    • 每一个有序对关系AB的,存在的关系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> 22 <3> 11 <3> 1,除非你有一个关系?,使得1?2,2?11?1(基本上,它将是一个关系允许任何配对)。

从语法的角度来看:您希望将关系运算符视为特殊运算符(+更像是一个函数运算符),类似于第三个选项。

+0

有趣。在我的情况下,我只有一种类型可用---浮点数(当目标是浮点数时,整数会自动转换为浮点数)---所以不会出现类型问题。我认为你的方法是在产生'1 < 3 > 2'的结果时产生一个'NaN',可能是在提高'invalid operation'标志后(参见IEEE 754 2008)? –

+0

也许,如果你不想实现这种类型的静态检查,并且你也不想实现布尔逻辑值('True','False'和'NaN'的布尔对象;再次,只有在你不想实现一个合适的类型系统)。 – 2012-08-23 14:31:48

+0

LaTeX是一种解释的宏语言。特别是,由于它没有被编译,AFAIK没有办法对这些比较关系进行静态检查。我认为,如果Python决定禁止'1 < 3 > 2',那么它也将不得不抛出异常。 –

2

Python链关系运算符。当你点击inis时,它会变得有趣,因为它们也被认为是关系型的。

>>> 1 < 2 in [True, False] 
False 
>>> 1 < 2 in [2, 4] 
True 
2

J评估语句从右到左,使得:

3 > 2 > 1 

首先变成

2 > 1 

哪些解析为真,表示成1,这样:

3 > 1 

哪也解决为真,因此1.相反的运营商<将重新造成错误,而整个陈述恰好是真实的。所以你没有进一步J.

你的主要问题是,你的初始表示:

3 > 2 > 1 

(3 > 2) AND (2 > 1) 

人速记因此,尽管预读似乎过甜的,这是真的什么代表需要。正如其他人所说的,除非有一些Python魔法。