2010-04-15 32 views
10

是否有支持鏈接符號的編程語言a < b < c將在條件語句中用來代替< b和b < c?編程語言中的鏈接不等式符號

例子:

  1. 如果(2 < X < 5)
  2. 如果(2 < X & & X < 5)

首先statementlooks更好的對我來說,它更容易理解編譯器可以使用傳遞性屬性來警告錯誤(例如,5 < x < 2會發出警告)。

回答

5

Icon做到這一點,它不是任何哈克特殊情況「鏈接」的一部分;它是Icon的目標導向評估模型的一部分。任何比較成功失敗。如果成功,它會產生右側。所以你可以寫

if 0 <= i <= j < n then ... 

它的工作原理和你所期望的一樣。但它不僅適用於比較,而且適用於任何表達式;這意味着你可以用完全相同的方式編寫你自己的「連鎖」函數。我喜歡Icon的這一方面,並​​希望更多的語言可以包含目標導向的評估。

N.B.在Guido在VHLL(90年代中期)介紹Python的論文中,他明確提到Icon是Python設計的靈感來源。

+0

Oooh ....閃亮。 – outis 2010-04-16 02:04:01

+0

我看到在Vala中也有實驗支持,請看這裏:http://live.gnome.org/Vala/Tutorial#Chained_Relational_Expressions – Davorin 2010-11-07 14:03:46

11

Python會這樣做。

+0

不得不一個參考......我想它查找文檔... – tutuca 2014-10-29 12:37:03

+0

@tutuca:我只是需要這些信息,所以參考這裏:https://docs.python.org/2/ reference/expressions.html#不在。 引用:在形式上,如果_a,B,C,...,Y,Z _是表達式和​​_op1,OP2,......,opN_是比較操作符,然後'一個OP1 b OP2ç... Y OPN z'相當於'a op1 b和b op2 c以及... y opN z',除了每個表達式最多被評估一次。 – collapsinghrung 2015-12-28 20:32:28

2

這聽起來像一個簡單的請求(顯然它很簡單,python實現它),但它並不一定很容易使用。它實際上打開了導致很多錯誤的能力。

具體而言,您使用的功能(或屬性在C#中,吸氣劑Java的情況下)任何時候

所以

public int GetX() 
{ 
    return 4; 
} 

(2 < GetX() < 5); 

(2 < GetX() > 5); 

(5 < GetX() < 2); 

好像這將是非常簡單的。但是如果GetX()有副作用會出現問題。

private int val = 10; 

public int GetCountdown() 
{ 
    return val--; 
} 

(2 < GetCountdown() < 5); 

(2 < GetCountdown() > 5); 

(5 < GetCountdown() < 2); 

在這種情況下,「GetCountdown()」會減少兩次還是一次? 「鏈式陳述」有沒有捷徑?

考慮上一個語句,它粗略地評估(英文)爲「是小於小於2的某個值」,這是不可能的,但取決於實現和副作用,有可能某些函數(Random.NextInt())可以通過這兩個測試

因此,需要每個項目只被評估一次,保存到下一個比較的局部變量。那麼你進入快捷方式的問題

public int GetOne() 
{ 
    return 1; 
} 

public int GetVar() 
{ 
    return -1; 
} 

(GetOne() < GetVar() < GetDBVal() < GetUserInput()) 

一般來說,你會想先檢查常量和變量b在做數據庫命中之前。但是如果我們說(如前所述),所有的值必須提前保存到局部變量中,這意味着它可能會調用數據庫命中,並要求用戶提供信息,即使「GetVar()」是 - 1,所以第一次比較失敗)

正如我前面所說,顯然Python允許這種語法,所以顯然是可能的。但是,不管我已經制定的技術含義如何(所有這些都易於設計),這意味着您的代碼是不太清楚,因爲下一個閱讀它的人不知道您是否已經考慮了所有這個。然而,if(x > 2 && x < 5) { }對我來說似乎很清楚,我知道它做了什麼,而且我知道編碼器的意圖。

+5

反對具有副作用的功能的一個很好的論據。 – 2010-04-15 09:50:56

+0

好吧,「GetDataFromDB()」本身沒有「副作用」,除非需要花費時間才能最好的避免。這樣做的目的只是爲了說明鏈接比較本身可能會產生意想不到的後果,因爲它不像原子比較那麼清晰。 – DevinB 2010-04-15 09:56:44

+0

從這裏得到的教訓是始終使用具有副作用的函數(我認爲GetDataFromDB()具有副作用:觸及外部世界)作爲**語句**。 **僅使用副作用免費代碼作爲**表達式**。 – 2010-04-15 10:33:50