2013-11-21 4 views
10

Я просто топал в begin...end в документации Erlang (here), но он не дает примеров того, как это полезно.Что начинается ... конец в Эрланге?

Глядя здесь в StackOverflow я нашел два случая, когда люди будут использовать begin...end, как в списковых:

Но мне интересно, если есть еще такие использует.

Может ли кто-нибудь предоставить другой сценарий, в котором begin...end полезен в Эрланге?

Благодаря

+0

вы можете просто использовать его для создания быстрого кода для оценки и создания требуемого значения. например 'T = {1,2, begin 1 + 2 end}.' Будет evalute 'T = {1,2,3}' –

+0

@MuzaayaJoshua Но ваш пример работает даже без начала. Может ли кто-нибудь привести пример, который на самом деле требует использования конца? Или они похожи на фигурные скобки? – Aus

+0

@ Ответьте на приведенные ниже ответы, есть примеры, которые не могут быть выполнены без начала ...end – 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 of, try of и перечислить понимание. Все они, за исключением понимания списка, не должны использоваться с конструкцией begin end, потому что переменные просачиваются во внешнюю область видимости, что приводит к тому, что последующие привязки становятся совпадениями.

Выражение выражения в списке отличается от того, что оно преобразуется в отдельную функцию со своей собственной областью, и никакая переменная, введенная в begin end, не протекает во внешнюю область видимости.

+0

В какой части' try''? в каждом из трех сегментов «try ... of ... catch» мы можем ввести несколько инструкций. – MondKin

+0

Хм, ты прав. Я думал, что только одно выражение разрешено в 'try выражения ... catch ... end'. На самом деле это отлично работает: 'try a = b, b of 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 

Это оценивающей А = 1, то возвращает результат А + 1.

Теперь мы знаем, что это не будет работать:

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

% returns syntax error before: ',' 
Смежные вопросы