2009-04-18 23 views
3

私はErlangでビットパターンマッチングを試しています:なぜ関数の引数に動的なビットパターンがありませんか?

-module(test). 
-export([test/2]). 

%test(P,<<X:P,0:1>>) -> 
% X. 

test(P,X) -> 
    <<Y:P,0:1>> = X, 
    Y. 

test/2のコメントアウトバージョンをコンパイルi「は変数 『P』は結合していない」という苦情を取得します。 最初のバージョンが2番目のバージョンと同じように動作しないようにする理由がありますか?そのため、コメントアウトバージョンPで

答えて

4

は長さである - それはアーランを動作させるために二重の一致を実行する必要があります - 未定であるパターンと第二のパラメータの値と一致し...

質問あなたは節のパターンの一致を求めています。「これは私のための節ですか?」ということはできません。「節にポップ」していなければ元に戻すことはできません。

2番目の例では、Xは試合前に拘束されている場合、あなたは節に入ることを約束しています。<<Y:P,0:1>> don't match Xの場合は、クラッシュ時間が十分にあります!

0

理由は、関数の引数が互いに独立して評価されるためです。変数へのバインディングの正確さは、第2ステップとしてのみチェックされます。

これは、最初の例では、パターンマッチングのルールに反して、2番目の引数を評価するときにPがアンバインドされることを意味します。対照的に、2番目の例では、Pはバイナリ上のパターンマッチの評価時にバインドされています。

関連する問題