erlang:'and'(true, false)
과 같은 접두어 부울 표현식을 쓸 수 있지만 해당 andalso
또는 orelse
표현식은 사용할 수 없습니다. 왜?andalso/2가 적절한 BIF로 구현되지 않는 이유는 무엇입니까?
a(A,B) -> A and B.
핵심
'a'/2 =
%% Line 4
fun (_cor1,_cor0) ->
call 'erlang':'and'
(_cor1, _cor0)
로 변환하지만 andalso는
에서 진행됩니다 - 예를 들어,나는 핵심 출력에서 보면, 그것은 andalso
및 orelse
같은 단지 매크로가 보인다
b(A,B) -> A andalso B.
to
'b'/2 =
%% Line 6
fun (_cor1,_cor0) ->
(case _cor1 of
(<('true'
-| ['compiler_generated'])> when 'true' ->
_cor0
-| ['compiler_generated'])
(<('false'
-| ['compiler_generated'])> when 'true' ->
'false'
-| ['compiler_generated'])
(<_cor2> when 'true' ->
(call ('erlang'
-| ['compiler_generated']):('error'
-| ['compiler_generated'])
(({('badarg'
-| ['compiler_generated']),_cor2}
-| ['compiler_generated']))
-| ['compiler_generated'])
-| ['compiler_generated'])
end
-| ['compiler_generated'])
게으름을 지키기 위해이 방법이 구현 된 것 같습니다.하지만이 단계에있을 필요는 없습니다. 나중에 번역 될 call 'erlang':'andalso'
행이있을 수 있습니다.
erlang:'andalso'(A,B)
은 A andalso B
과 동일하지 않거나 "조기 확장"으로 인해 어려움을 겪고 있습니까?
그래도 사용자가 예를 들어 글을 쓸 수 없습니까? 'erlang :'그리고 또한 '(true, false)'는 게으름을 보존하는 케이스 표현으로 분해 될 것인가? – amindfv
@amindfv'and','or', andalso'와'orelse'는 중위어 형태로 사용하기위한 것입니다. 'erlang : '과'/ 2','erlang : '또는'/ 2'는 BIF로 구현됩니다. 어딘가에 구현해야하기 때문입니다. 'andalso'와'orelse'는 컴파일러에서 확장으로 구현됩니다. 왜냐하면 컴파일러가 제대로 작동하려면 이렇게해야하지만'erlang : '그리고 역시'/ 2'와'erlang : 'orelse'/ 2'는 그렇지 않으면 어디서나 구현 될 수 있습니다. 잉여 (폐기물)를 제거하는 것은 얼랑의 정신입니다. –
@amindfv 예, BIF가'erlang : 'andalso'/ 2'와'erlang : ''orelse/2'를 호출했다면 컴파일러는 특수한 경우에 당신이 얻는 것과 동일한 코드로 확장해야합니다 오늘. 그렇습니다, KISS 규칙. – rvirding