bizarre match specs

Ulf Wiger (AL/EAB) <>
Thu Jan 19 16:56:33 CET 2006


I was toying around with using match specifications
to search on filenames. The idea was basically to 
take a match specification and compile parts of it to
a regexp-like thingie, and traverse a file tree.

(There is a reason, which at least in my mind seems 
sound, but that's a long story.)

Example:

1> MS = fun(Objs,Ms) -> Bin=ets:match_spec_compile(Ms),
             ets:match_spec_run(Objs, Bin) end.

2> L=[{"foo_a.erl",a},{"foo.erl",b},{"fooerl",c}].
[{"foo_a.erl",a},{"foo.erl",b},{"fooerl",c}]

3> MS(L,[{{"foo" ++
'$1','_'},[{'andalso',{'=/=','$1',[]},{'orelse',{'==','$1',".erl"},{'ore
lse',{'andalso',{'=/=',{'tl','$1'},[]},{'orelse',{'==',{tl,'$1'},".erl"}
,{'andalso',{'=/=',{'tl',{'tl','$1'}},[]},{'==',{'tl',{'tl','$1'}},".erl
"}}}}}}}],['$_']}]).
[{"foo_a.erl",a},{"foo.erl",b}]

Cool, eh? /:

Obviously, it's too ground to be generally useful, and 
I haven't tested how deeply I can nest the guards before
the whole thing chokes or gets totally useless.

Boy, would I like to have a regexp pattern in the match spec,
or perhaps 'let' and 'skipwhile' in the guards... ;-)

{{"foo" ++ '$1', '_'}, 
 [{'andalso',{'=/=','$1',[]},
   {let, '$2',
    {skipwhile, {tl,'$1'},
     {'=/=',{'hd','$2'},$\n}
     {'==', '$2', ".erl"}}}}],
 ['$_']}

One could also imagine bit syntax expressions in 
match specifications, right?  (:

Or should I just look for thrills elsewhere?

/Uffe



More information about the erlang-questions mailing list