我可以写前缀布尔表达式,例如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
,还是某种“过早的扩展”使这变得困难?