今更綺麗にひっかかったけど、Erlangは演算子の優先順位が他と違う。
例えばPython、
>>> 1 << 2 & 4 4
あるいはRuby、
irb(main):001:0> 1<<2 & 4 => 4
またはC、
% cat op.c #include <stdio.h> int main(){ printf("%d\n",1<<2&4); } % gcc op.c % ./a.out 4
これらの(メジャーと思われる)言語では、&の結合度が<<より低いため、
(1<<2) & 4
↓
4 & 4
↓
4
と解釈される。
それに対してErlangでは、band、andはビットシフトより優先されるので、
1> 1 bsl 2 band 4. 1
つまり、
1 bsl (2 band 4)
↓
1 bsl 0
↓
1
と解釈されているらしい。
他にも、
>>> True or False == False True
のようなPythonの式を、Erlangで同じように書くと、
> true or false == false. false
結果が違う。
これも、論理演算子(※andalsoとorelseは除く)の結合度が比較演算子のそれより高く、
(true or false) == false
↓
true == false
↓
false
と解釈されるために起こるようだ。
結局のところ「括弧で範囲を明示するのは(特にErlangでは)大事」という話なんだけど、Erlangの他からの乖離は面白い。
何か深い意味があるんだろうか・・・