¿Hay algún motivo especial por el que desee el patrón en una cuerda?
Los patrones como tales no existen en Erlang, en realidad solo pueden aparecer en el código.Una alternativa es usar las mismas convenciones que con ETS match
y select
y escribir su propia función de coincidencia. Es realmente bastante simple. La convención ETS usa un término para representar un patrón donde los átomos '$1'
, '$2'
, etc. se usan como variables que pueden ser enlazadas y probadas, y '_'
es la variable "no importa". Por lo tanto, sus patrones de ejemplo serían:
{book,'_'}
{ebook,'_'}
{dvd,"The Godfather"}
Esta es probablemente la forma más eficiente de hacerlo. Existe la posibilidad de utilizar las especificaciones de los partidos aquí, pero complicaría el código. Depende de la complicada coincidencia que necesites.
EDIT: añado sin código de comentario para parte de la matcher:
%% 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.
¡Genial! Tks Hynek. – xboard