のような接頭辞ブール式を書くことはできますerlang:'and'(true, false)
が、対応するandalso
ororelse
式は書くことができません。なんで?
コア出力を見ると、それは単なるマクロのように見え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
、それともある種の「時期尚早の拡張」がそれを困難にしていますか?