[erlang-questions] How to create a function using merl given a list of clauses
Frans Schneider
fchschneider@REDACTED
Thu Feb 15 08:19:25 CET 2018
Thanks Svilen, works now!
As always, it is in the docs but it sometimes requires reading it
several times.
Frans
On 02/14/2018 08:47 PM, Svilen Ivanov wrote:
> On Wed, 2018-02-14 at 13:31 +0100, Frans Schneider wrote:
>> Dear list,
>>
>> From a set of user defined rules, I want to create functions of the
>> form:
>>
>> fun([V1, V2]) ->
>> fun () when V1 < 1, is_atom(V2) -> foo();
>> () when V2 =/= b -> bar();
>> () -> false
>> end
>> end.
>>
>> The number of arguments, clauses and guards differ. Guards always
>> are
>> ANDed or andalso should be used.
>>
>> To build the internal fun I do something like:
>>
>> ...
>> -include_lib("syntax_tools/include/merl.hrl").
>> ...
>> tst() ->
>> %% This is the end result I want
>> V1 = 10,
>> V2 = a,
>> Func = ?Q(["fun () when _@REDACTED@ < 1, is_atom(_@REDACTED@) -> foo();",
>> " () when _@REDACTED@ =/= b -> bar();",
>> " () -> false ",
>> "end"]),
>> %% io:format("Func ~p~n", [Func]),
>> merl:print(Func),
>>
>> %% This is the data produced by some function
>> Guard1 = ?Q("_@REDACTED@ < 1"),
>> Guard2 = ?Q("is_atom(_@REDACTED@)"),
>> Guard3 = ?Q("_@REDACTED@ =/= b"),
>> GSeq1 = [Guard1, Guard2],
>> GSeq2 = [Guard3],
>>
>> %% Now start assembling the fun
>> Clause1 = ?Q("() when _@REDACTED -> foo()"),
>> Clause2 = ?Q("() when _@REDACTED -> bar()"),
>> Clauses = [Clause1, Clause2],
>> merl:print(Clauses),
>>
>> %% And this gives the error: syntax error before: 'fun'"
>> Func1 = ?Q("fun _@REDACTED end"),
>> merl:print(Func1).
>>
>> I just can't figure out a way to make the last step assembling the
>> fun work.
>>
>> Your suggestions are highly appreciated!
>>
>> Frans
>>
>
> You should look at "lifting" in http://erlang.org/doc/man/merl.html ,
> something like this seems to work:
> ----------------------------------------------------
> -include_lib("syntax_tools/include/merl.hrl").
>
> tst() ->
> V1 = merl:var('V1'),
> V2 = merl:var('V2'),
>
> Guard1 = ?Q("_@REDACTED < 1"),
> Guard2 = ?Q("is_atom(_@REDACTED)"),
> Guard3 = ?Q("_@REDACTED =/= b"),
> GSeq1 = [Guard1, Guard2],
> GSeq2 = [Guard3],
>
> Clause1 = ?Q("() when _@REDACTED -> foo()"),
> Clause2 = ?Q("() when _@REDACTED -> bar()"),
> Clauses = [Clause1, Clause2],
>
> Func1 = ?Q("fun() -> _@REDACTED@Clauses end"),
>
> Func2 = ?Q("fun([_@REDACTED,_@REDACTED]) -> _@REDACTED end"),
>
> merl:print(Func2).
> ------------------------------------------------------
>
> Svilen
>
More information about the erlang-questions
mailing list