2012-04-17 88 views
2

我有以二進制,我縮小到下面的玩具實例以提取一個二進制的前幾個比特匹配的可變數量的比特的一個問題:二進制位的參數匹配

f(<<H:Bits, _/binary>>, Bits) -> 
    H. 

的編譯器(R15B01)告訴我variable 'Bits' is unbound。在另一方面,這工作得很好:

f(X, Bits) -> 
    <<H:Bits, _/binary>> = X, 
    H. 

而且它做什麼,我希望,例如f(<<1,2,3,4>>, 8)產量1,和f(<<1,2,3,4>>, 16)產量258

爲什麼沒有第一種形式的工作?它不應該等同嗎?

+0

位語法中的所有大小表達式都必須綁定。第二個參數在匹配第一個之前沒有被綁定,並且顛倒順序不會改變這個。看起來參數是獨立匹配的。 – dsmith 2012-04-17 13:03:57

回答

4

在第一個例子f(<<H:Bits, _/binary>>, Bits) -> H中,變量位先前未被綁定 - 它同時出現在第一個和第二個參數模式中,但它們沒有以任何特定順序匹配,因此二進制中的位被認爲是未綁定的。在第二個示例中,f(X, Bits) -> <<H:Bits, _/binary>> = X,位在<<...>> = X的匹配開始之前變爲綁定。

第一個例子可以理解爲「採用第二個參數中給出的位數,並從二進制中提取許多位作爲H」(你想要的),但也可以理解爲「獲取一些任意數量位(可能儘可能多)作爲H,然後檢查它是否與第二個參數中傳遞的數字相同。爲了避免這種歧義,編譯器拒絕該程序。