What is begin…end in Erlang used for?

浪子不回头ぞ 提交于 2019-12-13 11:59:04

问题


I just stomped at a begin...end in Erlang's documentation (here), but it doesn't give some examples of how it is useful.

Looking here in StackOverflow I found two cases where people would be using begin...end, both in list comprehensions:

  • https://stackoverflow.com/a/5645116/979505
  • https://stackoverflow.com/a/5141263/979505

But I wonder if there are more of such uses.

Can anyone provide another scenario in which a begin...end is useful in Erlang?

Thanks


回答1:


Macros, for example:

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



回答2:


To evaluate a catch (always the same idea to have multiple expression reduced to one)

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



回答3:


As previous answerers mentioned, this construct is used whenever you need to have multiple expressions but only one is allowed.

However, the majority of such cases would be considered a stinky style. I can remember only a few of places where a single expression is expected: an argument in a function call, catch expression, case of, try of and list comprehension. All of them except for list comprehension shouldn't be used with begin end construct because the variables are leaking to the outer scope probably causing the subsequent bindings to become matches.

List comprehension expression is different because it is transformed to a separate function with its own scope and no variable introduced in begin end leaks to the outer scope.




回答4:


According to erlang documentation is it block expression that evaluates each expression but returns only the last one.

See this example (not using block expression):

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

% returns ok

Now you can define A within the case argument using block expression:

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

%returns ok

That evaluates A = 1, then returns the result of A + 1.

Now we know that this will not work:

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

% returns syntax error before: ','


来源:https://stackoverflow.com/questions/20125277/what-is-begin-end-in-erlang-used-for

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!