2013-11-21 12 views
10

Ho appena stompato uno begin...end nella documentazione di Erlang (here), ma non fornisce alcuni esempi di come sia utile.Per cosa si usa begin ... end in Erlang?

Guardando qui a StackOverflow ho trovato due casi in cui le persone avrebbero usato begin...end, sia in list comprehension:

ma mi chiedo se ci sono più di tale utilizza.

Qualcuno può fornire un altro scenario in cui un begin...end è utile in Erlang?

Grazie

+0

puoi semplicemente usarlo per creare codice rapido per valutare e creare il valore che desideri. per esempio. 'T = {1,2, inizio 1 + 2 fine} .' valuterà' T = {1,2,3} ' –

+0

@MuzaayaJoshua Ma il tuo esempio funziona anche senza inizio. Qualcuno può dare un esempio che in realtà richiede l'utilizzo di essere fine? O sono come parentesi graffe? – Aus

+0

@Aus controlla le risposte di seguito, ci sono esempi che non possono essere realizzati senza iniziare ...fine – MondKin

risposta

5

macro, ad esempio:

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

Grazie a @P_A. Alcuni chiarimenti in modo che altri non debbano testare ciò che ho appena testato. Una macro con più di un'espressione può essere fatta senza 'begin ... end'. Ma, se stai usando quella macro in un posto in cui è previsto un solo elemento (come in "io: format'), allora" begin ... end "è la strada da percorrere. – MondKin

+0

Come è meglio di -define (M (A, B), bar (A, B, foo())). ? –

+0

È solo un esempio per mostrare come 'begin ... end' può essere usato –

6

Per valutare un fermo (sempre la stessa idea di avere più ridotta espressione di uno)

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

Come answerers precedenti menzionato, questo costrutto viene utilizzato ogni volta che è necessario avere più espressioni, ma solo una è consentita.

Tuttavia, la maggior parte di questi casi sarebbe considerata uno stile puzzolente. Riesco a ricordare solo alcuni punti in cui è prevista un'espressione singola: un argomento in una chiamata di funzione, catch espressione, case of, try of e la comprensione di elenchi. Tutti, fatta eccezione per la comprensione delle liste, non dovrebbero essere usati con il costrutto begin end perché le variabili stanno perdendo nello scope esterno causando probabilmente la corrispondenza tra i binding successivi.

L'espressione di comprensione di un elenco è diversa perché viene trasformata in una funzione separata con un proprio ambito e nessuna variabile introdotta nelle perdite begin end nell'ambito esterno.

+0

In quale parte di' try of'? in ciascuno dei 3 segmenti di un 'try ... of ... catch' possiamo inserire diverse istruzioni. – MondKin

+0

Hmm, hai ragione. Ho pensato che solo un'espressione è consentita in 'prova l'espressione di ... catch ... end'. In realtà funziona bene: 'prova a = b, b di A -> A cattura C: E -> {C, E} fine. Grazie! –

+0

@DmitryBelyaev Non sei completamente sbagliato. – Aus

0

In base alla documentazione di erlang è l'espressione di blocco che valuta ogni espressione ma restituisce solo l'ultima.

Vedere questo esempio (non si usa l'espressione blocco):

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

% returns ok 

Ora è possibile definire una all'interno dell'espressione blocco case argomento utilizzando:

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

%returns ok 

che valuta A = 1, quindi restituisce il risultato di A + 1.

Ora sappiamo che questo non funzionerà:

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

% returns syntax error before: ',' 
Problemi correlati