Erlang의 andalso는 두 번째 인수가 boolean ()이 아니어도 좋습니다.

7342 단어 Erlang

개요



Erlang의 단락 평가 andalso여기서 "제 2 인수"는 "연산자의 오른쪽 값"을 의미합니다.
ex. orelse 의 「제2 인수」는 boolean() 의 것.
Expr1 andalso Expr2Expr2 는 다음과 같은 거동을 취한다.
1> true andalso false.
false
2> true andalso ok.
ok
3> false orelse true.
true
4> false orelse ok.
ok

검증



음, 문제는 이것이 사양인지 여부입니다.

1. 공식 문서



From R13A, Expr2 is no longer required to evaluate to a boolean value.

boolean value일 필요는 없다고 합니다.

참조 URL : Erlang - Expressions # 8.14 Short-Circuit Expressions

2. 일반적인 단락 평가에 대해서



지금까지 별로 신경 쓴 적은 없었지만, 여러가지 조사하고 있으면, 이 사양은 Erlang만이 아닌 것 같다.



참조 URL : 단락 평가 - Wikipedia

JavaScript, Perl, Ruby, Lisp 등에서 비슷한 거동이 있는 것 같다.

또, 내용은 할애하지만, 그 밖에도 이하와 같은 페이지와 유사한 내용이 정리되어 있었다.

참고 페이지 URL


  • 단락 평가 - Wikipedia
  • h tp // 그럼.ぃきぺぢ아. 오 rg / 우키 / % 7 % 9F % 오 D % 에 7 % B5 % 오 1 % 8 % 아 9 % 95 %

  • JavaScript 논리 연산자와 단락 평가 이야기. - C#에서 프로그래밍 저것 이것
  • htp // d. 하테나. 네. jp/fkmt5/20130421/1366561399

  • 논리 연산자(&& 와 ||)를 적용한다
  • ht tp // ch. 에요. 코m/쟈/bぉg/2007/12/27/cm포p/


  • 이상에서 andalso 이나 orelseExpr1 andalso Expr2Expr1 orelse Expr2 가 아니어도 좋다는 것이다.

    무엇을 할 수 있는가



    이런 끔찍한 사양을 찾아서 무엇을 할 수 있을까.

    예를 들어, Expr2에서 boolean()와 일치하는 defined_list() = [{Key::atom(), Value::any()}] | undefined일반적으로는 다음과 같이 쓸 수 있다.

    sample_code1.erl
    get_value(_Key, undefined) ->
        {error, not_match}; %% NOT_MATCH_PROCESS
    get_value(Key, DefiendList) ->
        case proplists:get_value(Key, DefinedList) of
            {Key, Value} -> {ok, Value};
            _            -> {error, not_match} %% NOT_MATCH_PROCESS
        end.
    

    그러나, Key 의 제 2 인수가 Value 가 아니어도 되는 것을 사용하면(자), 좀 더 짧게 코드를 쓸 수가 있다.

    sample_code.erl
    get_value(Key, DefinedList) ->
        case DefinedList =:= undefined orelse proplists:get_value(Key, DefinedList) of
            {Key, Value} -> {ok, Value};
            _            -> {error, not_match} %% NOT_MATCH_PROCESS
        end.
    

    ※상기 코드는 설명으로 사용하는 것을 생각해 간단하게 써 있기 때문에, 그대로는 사용할 수 없다고 생각된다. (에러 처리 등)

    이 코드에서는 값이 없는 경우의 처리가 짧기 때문에 그렇게 얻은 느낌은 하지 않지만, 값이 없는 경우의 처리(NOT_MATCH_PROCESS) orelse 두는 것이 유지 보수 비용이 낮을 것으로 보인다.

    요약



    Erlang의 단락 평가 boolean()
    단지, 가독성 등도 있으므로, 장소를 선택해 사용해 가고 싶다.

    그건 그렇고 ...



    위의 8.14 Short-Circuit Expressions의 인용 부분 뒤에는 다음과 같다.

    As a consequence, andalso and orelse are now tail-recursive. For instance, the following function is tail-recursive in R13A and later:
    all(Pred, [Hd|Tail]) ->
        Pred(Hd) andalso all(Pred, Tail);
    all(_, []) ->
        true.
    

    나는 지금은 아직 단락 평가를 말미 재귀로 사용한 기억은 없지만, 사용할 수 있는 곳이 있으면 사용해 가고 싶다.

    좋은 웹페이지 즐겨찾기