erlang中的函数相等/排序

meg*_*ord 7 erlang ambiguity undefined-behavior

是什么意思,比较在二郎山功能与运营商=:=,==,<,>,=<,>=?我正在玩翻译,并得到了这些结果:

Eshell V5.9.2  (abort with ^G)
1> X = fun() -> {} end.
#Fun<erl_eval.20.82930912>
2> Y = fun() -> {} end.
#Fun<erl_eval.20.82930912>
3> 
3> {X == X, X =:= X}.
{true,true}
4> {X >= X, X =< X}.
{true,true}
5> {X > X, X < X}.
{false,false}
6> 
6> {X == Y, X =:= Y}.
{true,true}
7> {X >= Y, X =< Y}.
{true,true}
8> {X > Y, X < Y}.
{false,false}
Run Code Online (Sandbox Code Playgroud)

这是有道理的.看起来它正在比较两个函数的抽象语法树.

但是在这个会话中X,Y再次定义相同但又不同,现在X<Y呢?

Eshell V5.9.2  (abort with ^G)
1> X = fun() -> {} end.
#Fun<erl_eval.20.82930912>
2> 
2> {X == X, X =:= X}.
{true,true}
3> {X >= X, X =< X}.
{true,true}
4> {X > X, X < X}.
{false,false}
5> 
5> Y = fun() -> {} end.
#Fun<erl_eval.20.82930912>
6> 
6> {X == Y, X =:= Y}.
{false,false}
7> {X >= Y, X =< Y}.
{false,true}
8> {X > Y, X < Y}.
{false,true}
Run Code Online (Sandbox Code Playgroud)

所以看起来它不是比较AST 任何类型的唯一引用.也许它是比较参考,只是一些优化正在发生,XY绑定到相同的参考?如果对此有一些解释,不同的VM或不同节点会发生什么?

Pas*_*cal 4

shell中2次评估的差异来自于空行6>。如果您使用函数 erlang:fun_info/1 查看 fun,您会发现在这种情况下,子句存储为不同的数字(即 2 而不是 1)。

如果你再次输入Y的定义(没有空行),你会得到一个错误的匹配,如果你之前输入一个空行,那就可以了。

我认为这是使用 shell 的副作用,但该行为在程序中是一致的。当然,> 或 < 的含义并不明显,但 == 是的。还有一件好事是,Erlang 术语的顺序是定义的,因此可以对具有可预测行为的任何术语的列表进行排序:

number < atom < reference < fun < port < pid < tuple < list < bit string
Run Code Online (Sandbox Code Playgroud)

  • @halfelf 不,“==”对于比较任何事物都很有用。您应该只知道比较的语义。我不会认真比较函数,“相等”函数有太多的方式可以不相等。例如,如果您希望它比较 AST,那么请注意 AST 包含行号。 (3认同)