2013-07-13 2 views
5

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는

에서 진행됩니다 - 예를 들어,

나는 핵심 출력에서 ​​보면, 그것은 andalsoorelse 같은 단지 매크로가 보인다

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과 동일하지 않거나 "조기 확장"으로 인해 어려움을 겪고 있습니까?

답변

8

가장 큰 이유는 점에서 호출에 "정상"기능이 그들의 주장에 엄격한으로 BIFS에 대한 호출이 BIF/함수가 호출되기 전에 모든 인수가 평가되고, 같은 방식으로 행동한다는 것이다. andalsoorelse과 구별되는 점은 이들이 모두 이 아니며은 첫 번째 인수 만 평가한다는 것입니다. 그러면 첫 번째 인수의 값에 따라 두 번째 인수를 평가할 수도 있고하지 않을 수도 있습니다. 이것은 BIFS 일지라도 어쨌든 컴파일러가 특별히 처리해야하므로 BIF를 작성하는 데는 별다른 요지가 없음을 의미합니다.

또한 확장이 매우 간단하므로 특별히 BIF를 처리 할 때 약간의 이득이 있습니다.

+0

그래도 사용자가 예를 들어 글을 쓸 수 없습니까? 'erlang :'그리고 또한 '(true, false)'는 게으름을 보존하는 케이스 표현으로 분해 될 것인가? – amindfv

+0

@amindfv'and','or', andalso'와'orelse'는 중위어 형태로 사용하기위한 것입니다. 'erlang : '과'/ 2','erlang : '또는'/ 2'는 BIF로 구현됩니다. 어딘가에 구현해야하기 때문입니다. 'andalso'와'orelse'는 컴파일러에서 확장으로 구현됩니다. 왜냐하면 컴파일러가 제대로 작동하려면 이렇게해야하지만'erlang : '그리고 역시'/ 2'와'erlang : 'orelse'/ 2'는 그렇지 않으면 어디서나 구현 될 수 있습니다. 잉여 (폐기물)를 제거하는 것은 얼랑의 정신입니다. –

+0

@amindfv 예, BIF가'erlang : 'andalso'/ 2'와'erlang : ''orelse/2'를 호출했다면 컴파일러는 특수한 경우에 당신이 얻는 것과 동일한 코드로 확장해야합니다 오늘. 그렇습니다, KISS 규칙. – rvirding

관련 문제