2013-11-21 63 views
10

我剛剛在Erlang的文檔(here)中登記了begin...end,但沒有給出它的一些有用的例子。Erlang用於開始......結尾是什麼?

尋找這裏的StackOverflow我發現兩種情況下,人們會使用begin...end,無論是在列表解析:

但我不知道是否有更多的這樣的使用。

任何人都可以提供另一種方案,其中begin...end在Erlang中很有用嗎?

由於

+0

您可以使用它創建快速代碼來評估和創建所需的值。例如'T = {1,2,begin 1 + 2 end} .'將評估'T = {1,2,3}' –

+0

@MuzaayaJoshua但是您的示例即使沒有開始結束也可以運行。任何人都可以給出一個實際需要使用結束的例子嗎?還是他們喜歡花括號? – Aus

+0

@Aus檢查下面的答案,有些例子不能在沒有開始的情況下完成...結束 – MondKin

回答

5

宏,例如:

-define(M(A, B), 
    begin 
     C = foo(), 
     bar(A, B, C) 
    end). 
+1

謝謝@P_A。一些澄清,以便其他人不必測試我剛纔測試的內容。一個有多個表達式的宏可以不用'begin ... end'。但是,如果你在一個只有一個元素的地方使用這個宏(比如'io:format'),那麼'begin ... end'就是要走的路。 – MondKin

+0

這是如何比-define(M(A,B),bar(A,B,foo()))更好。 ? –

+0

這只是一個例子來說明如何使用'begin ... end' –

6

爲了評價趕上(總是相同的想法有多個表達減少到一個)

Res = (catch 
    begin 
     C = foo(Bar), 
     io:format("evaluation of C ok~n"), 
     D = bar(A, B, C) 
    end), 
3

正如前面的回答者所提到的,只要你需要有多個表達式,但只有一個表達式被允許,就使用這個構造。

但是,大多數這種情況下會被認爲是一種臭的風格。我只能記住一些預期有單個表達式的地方:函數調用中的參數,catch表達式,case oftry of和列表理解。除列表理解以外的所有內容都不能與begin end構造一起使用,因爲變量泄漏到外部範圍可能導致後續綁定變爲匹配。

列表理解表達式是不同的,因爲它被轉換爲一個單獨的函數,它自己的作用域,並且在begin end中沒有引入變量泄漏到外部作用域。

+0

在'try of'的哪個部分?在「try ... of ... catch」的3段中,我們可以放幾條指令。 – MondKin

+0

嗯,你說得對。我認爲只有一個表達式可以在'catch ... end'表達式的try 中被允許。其實這工作正常:'嘗試a = b,A的A - >一個catch C:E - > {C,E} end.'。謝謝! –

+0

@DmitryBelyaev你並不完全錯誤。 – Aus

0

根據erlang文檔,它是評估每個表達式的塊表達式,但只返回最後一個。

參見本實施例中(未使用塊表達式):

A = 1, 
case A + 1 of 
    3 -> 
     ok; 
    _-> 
     nop 
end. 

% returns ok 

現在可以的情況下的參數使用塊表達式內定義一個:

case begin A = 1, A + 1 end of 
    3 -> 
     ok; 
    _-> 
     nop 
end. 

%returns ok 

計算結果A = 1,然後返回A + 1的結果。

現在我們知道這是行不通的:

case A = 1, A + 1 of 
    3 -> 
     ok; 
    _-> 
     nop 
end. 

% returns syntax error before: ','