Hi Richard<br><br>Could you give a code example of the second alternativ please? This question is not related to first class pattern matching, I use alternative 1 to generate mocks but would rather use alternative 2 as my mocks does not need the preprocessor.<br>
<br>Thank you<br>/Fredrik<br><br><div class="gmail_quote">On Thu, Oct 30, 2008 at 9:30 AM, Richard Carlsson <span dir="ltr"><<a href="mailto:richardc@it.uu.se">richardc@it.uu.se</a>></span> wrote:<br><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>Depending on what you need, in terms of efficiency (is the code going to<br>
be a bottleneck, or just executed occasionally?), and if you really need<br>
to do metaprogramming (often a big *if*), there are several options:<br>
<br>
 - Output the code as plain text to a .erl-file and call the compiler.<br>
   (Dead simple, and quite flexible - can use macros and includes for<br>
    "template" stuff so you don't need to generate that as well.)<br>
<br>
 - Generate the code as text in memory, call the scanner and parser, and<br>
   pass the result to compile:forms/2. You can't use the preprocessor<br>
   this way (it only works on files), but you don't have to go to disk,<br>
   and you don't need to learn about the syntax tree representation.<br>
<br>
 - Generate the syntax trees directly and pass to the compiler. Fiddly,<br>
   unreadable and hard to maintain, but low-overhead and full control.<br>
<br>
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<br>
<font color="#888888"><br>
    /Richard<br>
</font><div><div></div><div class="Wj3C7c">_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://www.erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://www.erlang.org/mailman/listinfo/erlang-questions</a><br>
</div></div></blockquote></div><br>