Есть ли какая-то особая причина, по которой вы хотите, чтобы шаблон в строке?
Шаблоны как таковые не существуют в Erlang, они действительно могут встречаться только в коде.Альтернатива - использовать те же соглашения, что и для ETS match
и select
, и написать собственную функцию сопоставления.Это действительно довольно просто.В соглашении ETS используется термин для представления шаблона, в котором атомы '$1'
, '$2'
и т. Д. Используются в качестве переменных, которые могут быть связаны и проверены, а '_'
- это переменная значения.Таким образом, ваши примеры шаблонов станут такими:
{book,'_'}
{ebook,'_'}
{dvd,"The Godfather"}
Это, вероятно, самый эффективный способ сделать это.Здесь можно использовать спецификации совпадений, но это усложнит код.Это зависит от того, насколько сложное сопоставление вам нужно.
РЕДАКТИРОВАТЬ: Я добавляю без кода комментария для части соответствия:
%% match(Pattern, Value) -> {yes,Bindings} | no.
match(Pat, Val) ->
match(Pat, Val, orddict:new()).
match([H|T], [V|Vs], Bs0) ->
case match(H, V, Bs0) of
{yes,Bs1} -> match(T, Vs, Bs1);
no -> no
end;
match('_', _, Bs) -> {yes,Bs}; %Don't care variable
match(P, V, Bs) when is_atom(P) ->
case is_variable(P) of
true -> match_var(P, V, Bs); %Variable atom like '$1'
false ->
%% P just an atom.
if P =:= V -> {yes,Bs};
true -> no
end
end.
match_var(P, V, Bs) ->
case orddict:find(P, Bs) of
{ok,B} when B =:= V -> {yes,Bs};
{ok,_} -> no;
error -> {yes,orddict:store(P, V, Bs)}
end.