One solution is to use macros as a wrapper around a fun. So for example you could define:<br><br>-define(pattern(Pat, Ret) , fun (Pat) -> {yes,Ret}; (_) -> no end).<br><br>and then use it like:<br><br>Match = ?pattern({x,X,y,z}, X),<br>
<br>Match({x,anything,yz}) ==> {yes,anything}.<br><br>and use it like:<br><br>case Match(Value) of<br>    {yes,X} -> ... ;<br>    no -> ...<br>end<br><br>As for Francois request you could probably use macros there as well, but your question was very general so I can not really give you a suggestion. What are you after?<br>
<br>As Richard said variables in Erlang don't exist as in Prolog so you can only "create" them by binding them to a value. They also have to be always bound so you cannot "return" a variable, only a value which can then be bound to a variable, as in the macro example above. The X in the macro call never escapes from the fun it is only used to show which values from the pattern are returned.<br>
<br>Robert<br><br><div class="gmail_quote">2008/10/29 anders conbere <span dir="ltr"><<a href="mailto:aconbere@gmail.com">aconbere@gmail.com</a>></span><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">On Wed, Oct 29, 2008 at 7:24 AM, Richard Carlsson <<a href="mailto:richardc@it.uu.se">richardc@it.uu.se</a>> wrote:<br>
> Francois De Serres wrote:<br>
>> Hi there.<br>
>><br>
>> I need a function that actually does pattern matching: pm(Tuple, Pattern)->MatchedPattern|error<br>
><br>
> You cannot pass a pattern with uninstantiated variables to a function.<br>
> Erlang is a strict functional language, it is not Prolog. Patterns are<br>
> not run-time values.<br>
<br>
</div>That being said, the lack of first class access to Patterns makes<br>
programmatic access to a few of the most common tools in erlang<br>
exceptionally difficult. Constructing case statements at runtime is<br>
impossible with out accessing the preproccessor, building functions at<br>
runtime that have many different possible patterns, also impossible.<br>
It seems like there should be some way to gain access to this.<br>
<br>
I could for instance imagine delaying access to with a function that<br>
accepted something like<br>
<br>
pattern(x, supplies("X"), y, z)<br>
<br>
which would return a function that when applied to a tuple<br>
<br>
{x, anything, y, z}<br>
<br>
would return<br>
<br>
{ok, {match, [{"X", anything}]}}<br>
<br>
and in that way you could construct semantics for applying those to<br>
case statements or function parameters, etc. Maybe that's crazy, but I<br>
sympathize with Francois, I've been trying to fumble my way through<br>
erlang metaprogramming and just running into huge walls like this.<br>
<font color="#888888"><br>
~ Anders<br>
</font><div><div></div><div class="Wj3C7c"><br>
<br>
<br>
<br>
><br>
>    /Richard<br>
> _______________________________________________<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>
><br>
_______________________________________________<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>