2012-08-23 73 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魔法。