2013-11-21 12 views
10

Ich stampfte nur auf begin...end in Erlangs Dokumentation (here), aber es gibt keine Beispiele, wie es nützlich ist.Wofür wird ... Ende in Erlang verwendet?

Suche hier in Stackoverflow fand ich zwei Fälle, in denen Menschen begin...end, die beide in Listenkomprehensionen verwenden würde:

Aber ich frage mich, ob es einer solchen mehr sind Verwendet.

Kann jemand ein anderes Szenario zur Verfügung stellen, in dem ein begin...end in Erlang nützlich ist?

Dank

+0

können Sie einfach verwenden, um Quick-Code zu erstellen, um den gewünschten Wert zu bewerten und zu erstellen. z.B. 'T = {1,2, Anfang 1 + 2 Ende} .' wird ausgewertet' T = {1,2,3} ' –

+0

@MuzaayaJoshua Aber dein Beispiel funktioniert auch ohne Anfang Ende. Kann jemand ein Beispiel geben, das tatsächlich erfordert, Ende zu sein? Oder sind sie wie geschweifte Klammern? – Aus

+0

@Aus überprüfen Sie die Antworten unten, es gibt Beispiele, die nicht ohne Start erreicht werden können ...Ende – MondKin

Antwort

5

Makros, zum Beispiel:

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

Danke @P_A. Einige Klarstellungen, damit andere nicht testen müssen, was ich gerade getestet habe. Ein Makro mit mehr als einem Ausdruck kann ohne 'begin ... end' erstellt werden. Aber wenn Sie dieses Makro an einer Stelle verwenden, wo nur ein Element erwartet wird (wie in 'io: format'), dann ist' begin ... end' der richtige Weg. – MondKin

+0

Wie ist das besser als -define (M (A, B), bar (A, B, foo())). ? –

+0

Es ist nur ein Beispiel um zu zeigen, wie 'begin ... end' verwendet werden kann –

6

Um einen Fang zu bewerten

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

Wie schon in früheren Beantworter erwähnen (immer die gleiche Idee mehr Ausdruck auf einem reduziert haben), Dieses Konstrukt wird immer dann verwendet, wenn mehrere Ausdrücke erforderlich sind, aber nur einer zulässig ist.

Allerdings würde die Mehrheit dieser Fälle als stinkender Stil betrachtet werden. Ich kann mich nur an einige Stellen erinnern, wo ein einzelner Ausdruck erwartet wird: ein Argument in einem Funktionsaufruf, catch Ausdruck, case of, try of und Listenverständnis. Alle mit Ausnahme des Listenverständnisses sollten nicht mit dem Konstrukt begin end verwendet werden, da die Variablen in den äußeren Bereich eindringen, was wahrscheinlich dazu führt, dass die nachfolgenden Bindungen zu Übereinstimmungen werden.

List Verständnis Verständnis Ausdruck ist anders, weil es in eine separate Funktion mit einem eigenen Umfang umgewandelt wird und keine Variable in begin end Lecks in den äußeren Bereich eingeführt.

+0

In welchem ​​Teil von' try of'? In jedem der 3 Segmente eines "try ... of ... catch" können wir mehrere Anweisungen eingeben. – MondKin

+0

Hmm, du hast Recht. Ich dachte, dass nur ein Ausdruck erlaubt ist in "try of ... catch ... end" Ausdruck. Eigentlich funktioniert das gut: 'versuche a = b, b von A -> Ein Fang C: E -> {C, E} Ende.'. Vielen Dank! –

+0

@DmitryBelyaev Sie liegen nicht ganz falsch. – Aus

0

Nach Erlang Dokumentation ist es Block Ausdruck, der jeden Ausdruck bewertet, aber nur die letzte zurückgibt.

Sehen Sie dieses Beispiel (nicht Block unter Verwendung des Ausdrucks):

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

% returns ok 

Jetzt Sie A im Fall Argument Block Ausdruck definieren:

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

%returns ok 

Das A 1 wertet =, dann kehrt die Ergebnis der A + 1.

Jetzt wissen wir, dass dies nicht funktionieren wird:

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

% returns syntax error before: ','