2010-01-30 32 views
2

我最近試圖理解一個C++程序,這個程序是由我認爲有功能編程背景的人編寫的:例如,他已經宣佈了一個他廣泛使用的類封閉類,它有點類似於所謂的在函數式編程中關閉。另一個班被稱爲後衛,但我還沒有弄清楚它有什麼好處。它似乎具有某種清理功能。什麼語言有「保護」關鍵字或概念?

我看過一個叫做guard這個概念的唯一語言就是Erlang,但這並不像我發現的代碼。在其他語言中,C++代碼的作者可能會提到這樣的概念嗎?

+10

你能舉一個例子嗎? – AraK 2010-01-30 15:33:23

+1

在C++中,a ** guard變量**是一個線程安全的布爾值,用於確保一個靜態變量剛剛被初始化一次(在概念上類似於Singleton),這與功能語言中的「守衛」完全不同,類似於**條件語句**。但是由於這個名稱來自自定義類,因此很難說出它指向哪個函數。 – kennytm 2010-01-30 15:47:54

+0

AraK:對不起,我無法發表任何代碼。有一件事我可以說,它顯然與指定Erlang或Haskell條件的機制無關。 – hillu 2010-01-30 15:51:18

回答

6

對我來說,這聽起來像他正在使用RAII。
類構造器/析構函數用於在異常安全的上下文中對稱地處理某種形式的資源分配/釋放(Java程序員最終會調用,因爲析構函數被保證被調用)。

這是一個非常常見的C++習慣用法,廣泛用於現代C++。

做的代碼看起來是這樣的:

void Plop() 
{ 
    Guard guard(lock); 
    // Do lots of stuff 
} 

這裏的守衛被鎖定在構造函數中的鎖定和解鎖在析構函數鎖。

+1

+1我懷疑這是實際的正確答案。功能性的東西可能是一個紅鯡魚。 – 2010-01-30 19:57:28

+0

如果你的意思是「資源分配是初始化」,你幾乎肯定是對的。謝謝!不過,我仍然不確定'guard'這個詞的意思。 – hillu 2010-02-02 08:36:44

+0

它防範異常導致的問題! – 2010-02-02 08:48:20

3

Haskell的Control.Monad模塊有guard

guard :: MonadPlus m => Bool -> m()
guard breturn()如果bTruemzero如果bFalse

例如,計算勾股數,其中每個支腿比25不再,你可以使用

triples = do 
    a <- [1..25] 
    b <- [a..25] 
    c <- [b..25] 
    guard (p a b c) 
    return (a,b,c) 
    where 
    p a b c = a*a + b*b == c*c 

對於正在發生的事情的說明,請參見我的博客文章A programmable semicolon explained

4

一般來說,一個後衛只是一個構造,需要評估爲true,以便沿某條路繼續執行。這個或類似的東西存在於所有有用的圖靈完全編程語言中,但可能非常基本,通常不會單獨作爲實體命名。下面是在Haskell一個簡單的例子:

f x 
| x < 0 = -x 
| otherwise = x 

這相當於絕對值函數:否定的數,如果它是負的,以產生其正對應;否則,返回傳入的相同值。此處有兩個警衛:x < 0,當x小於零時爲true,並且otherwise始終爲真。

2

計算機科學中的警衛通常指代指示循環構造應該繼續的布爾表達式。例如(赦免雙關)

for (int i = 0; i < N; ++i) 
    /* stuff */ 

這裏,i < N是警衛。

很難在沒有更多信息的情況下更徹底地回答您的問題。

6

術語「警衛」用於several functional languages它在Erlang中使用的方式,但該用法似乎不符合您的描述。在沒有看到C++代碼的情況下,很難真正知道它的意圖。

根據你的描述猜測,它會實現類似於Haskell的bracket,這基本上可以確保在包裝函數退出時釋放一些資源,即使這是由異常發生的。在Python中,人們會使用finally來實現這一點,在C++中,通常在堆棧中的對象的析構函數中有清除代碼。