Почему нет динамического бита в аргументе функции? - PullRequest
3 голосов
/ 18 апреля 2009

Я экспериментирую с сопоставлением битовых комбинаций в Erlang:

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

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

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

при компиляции закомментированной версии test/2 я получаю жалобу на то, что "переменная 'P' не связана". Есть ли веская причина для того, чтобы первая версия не работала так же, как вторая?

Ответы [ 2 ]

4 голосов
/ 18 апреля 2009

Поскольку в закомментированной версии P есть длина - для ее работы Erlang потребуется выполнить двойное совпадение - сопоставить значение 2-го параметра с шаблоном, который не определен ...

Вопрос, который вы задаете при сопоставлении с шаблоном предложения: «это предложение для меня» - вы не можете «войти в предложение» и затем вернуться, если это не так ...

Во втором примере X связывается перед матчем, вы обязуетесь войти в предложение, и если <<Y:P,0:1>> don't match X, время сбоя скважины!

0 голосов
/ 26 сентября 2009

Причина в том, что аргументы функции оцениваются независимо друг от друга. Правильность привязок к переменным проверяется только в качестве второго шага.

Это означает, что в вашем первом примере P будет несвязанным при оценке второго аргумента, что противоречит правилам сопоставления с образцом. Напротив, во втором примере P связан во время оценки соответствия шаблона в двоичном файле.

...