5

のような接頭辞ブール式を書くことはできますerlang:'and'(true, false)が、対応するandalsoororelse式は書くことができません。なんで?

コア出力を見ると、それは単なるマクロのように見えandalsoますorelse-たとえば:

a(A,B) -> A and B.

コアに変換します

'a'/2 =
    %% Line 4
    fun (_cor1,_cor0) ->
        call 'erlang':'and'
            (_cor1, _cor0)

しかし、また、

b(A,B) -> A andalso B.

'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、それともある種の「時期尚早の拡張」がそれを困難にしていますか?

4

1 に答える 1

8

主な理由は、BIF の呼び出しは、引数が厳密であるという点で「通常の」関数の呼び出しと同じように動作するためです。すべての引数は、BIF/関数が呼び出される前に評価されます。andalsoandの特徴orelseは、すべての引数を評価するのではなく、最初の引数のみを評価することです。次に、最初の引数の値に応じて、2 番目の引数を評価する場合と評価しない場合があります。これは、それらが BIFS であったとしても、コンパイラによって特別に処理される必要があるため、BIF を作成する意味はほとんどないことを意味します。

また、拡張は非常に簡単なので、特別に処理された BIF として実行するメリットはほとんどありません。

于 2013-07-14T03:39:33.887 に答える