2008/10/30 Richard Carlsson <span dir="ltr"><<a href="mailto:richardc@it.uu.se">richardc@it.uu.se</a>></span><br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="Ih2E3d">Francois De Serres wrote:<br>
> Thank you Richard.<br>
> Any way to overcome this with parsing/binding/eval magic, even cumbersome ?<br>
<br>
</div>But doing compilation on the fly might not be suitable if you are going<br>
to do it a million times (unless you can reuse the same module name, you<br>
will have to generate unique module names for each new compilation, and<br>
who will then be responsible for deleting unused modules?). If the code<br>
you are going to run is short and not a bottleneck, it could be better<br>
to use erl_eval, for example like this:<br>
<br>
make_match_fun(Pstr) -> element(2, erl_eval:expr(hd(element(2,<br>
erl_parse:parse_exprs(element(2,<br>
erl_scan:string(lists:flatten(io_lib:format("fun (~s=__P) -><br>
{matched,__P}; (_) -> fail end.", [Pstr]))))))), erl_eval:new_bindings())).<br>
<br>
This will, via erl_eval, produce a fun that can be used like you wanted:<br>
<br>
F = make_match_fun("{X,Y}")<br>
<br>
F({1,2}) ==> {matched, {1,2}}<br>
<br>
F({}) ==> fail</blockquote><div><br>My macro basically does this is easier, at least I think so.<br><br>Robert<br><br></div></div>