Erlang의 andalso는 두 번째 인수가 boolean ()이 아니어도 좋습니다.
7342 단어 Erlang
개요
Erlang의 단락 평가 andalso
여기서 "제 2 인수"는 "연산자의 오른쪽 값"을 의미합니다.
ex. orelse
의 「제2 인수」는 boolean()
의 것.
Expr1 andalso Expr2
와 Expr2
는 다음과 같은 거동을 취한다.
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
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
이상에서
andalso
이나 orelse
의 Expr1 andalso Expr2
는 Expr1 orelse Expr2
가 아니어도 좋다는 것이다.무엇을 할 수 있는가
이런 끔찍한 사양을 찾아서 무엇을 할 수 있을까.
예를 들어, Expr2
에서 boolean()
와 일치하는 defined_list() = [{Key::atom(), Value::any()}] | undefined
일반적으로는 다음과 같이 쓸 수 있다.
sample_code1.erlget_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.erlget_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.
나는 지금은 아직 단락 평가를 말미 재귀로 사용한 기억은 없지만, 사용할 수 있는 곳이 있으면 사용해 가고 싶다.
Reference
이 문제에 관하여(Erlang의 andalso는 두 번째 인수가 boolean ()이 아니어도 좋습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/KOU_CHANG/items/a5c6bc7177976a8d8640
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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.
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.
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.
나는 지금은 아직 단락 평가를 말미 재귀로 사용한 기억은 없지만, 사용할 수 있는 곳이 있으면 사용해 가고 싶다.
Reference
이 문제에 관하여(Erlang의 andalso는 두 번째 인수가 boolean ()이 아니어도 좋습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/KOU_CHANG/items/a5c6bc7177976a8d8640
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
all(Pred, [Hd|Tail]) ->
Pred(Hd) andalso all(Pred, Tail);
all(_, []) ->
true.
Reference
이 문제에 관하여(Erlang의 andalso는 두 번째 인수가 boolean ()이 아니어도 좋습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/KOU_CHANG/items/a5c6bc7177976a8d8640텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)