10

=:=Erlang の関数を演算子, ==, <, >,=<と比較するとはどういう意味>=ですか?

私はインタプリタをいじっていて、これらの結果を得ました:

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}

意味あり。2 つの関数の抽象構文ツリーを比較しているようです。

しかし、このセッションXYは と は再び同じように定義されていますが、今も違い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}

したがって、AST一意の参照を比較していないようです。参照を比較しているのかもしれませんが、いくつかの最適化が行われてXおりY、同じ参照にバインドされていますか? これについて何らかの説明がある場合、異なる VM または異なるノードで何が起こるでしょうか?

4

2 に答える 2

4

シェルでの 2 つの評価の違いは、空白行 6> に由来します。関数 erlang:fun_info/1 を使用して fun を調べると、その場合、句が異なる番号 (つまり、1 ではなく 2) で格納されていることがわかります。

Y の定義を (空行なしで) もう一度入力すると不一致になりますが、前に空行を入力すれば問題ありません。

これはシェルを使うことの副作用だと思いますが、動作はプログラム内で一貫しています。もちろん、> や < の意味は楽しいのでわかりませんが、== はい。また、Erlang 用語の順序が定義されているため、予測可能な動作で任意の用語のリストをソートすることができます。

number < atom < reference < fun < port < pid < tuple < list < bit string
于 2012-10-26T08:57:48.680 に答える