<div dir="ltr"><div>Very nice Julien!</div><div><br></div><div>I just went ahead and went the code generation way. Already works, based off of some code I wrote a while ago to do some Mercury codegen.</div><div><br></div><div>I like this solution a lot, very straightforward and  does exactly what I thought should be possible within type_desc and construct but wasn't sure exactly how.</div><div><br></div><div>Thanks!</div><div>Aistis Raulinaitis<br></div><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Jul 19, 2020 at 10:27 PM Julien Fischer <<a href="mailto:jfischer@opturion.com">jfischer@opturion.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Hi,<br>
<br>
On Sun, 19 Jul 2020, Ace wrote:<br>
<br>
> So say I have some enum:<br>
> <br>
> `:- type ex ---> a; b; c.`<br>
> <br>
> And I want to generate a function similar to:<br>
> <br>
> ```<br>
> :- pred ex_mul(ex::out) is multi.<br>
> ex_mul(a).<br>
> ex_mul(b).<br>
> ex_mul(c).<br>
> ```<br>
> <br>
> Any kind of standard library predicate I can use so I don't have to<br>
> add a new case to the predicate for every instance of the enum?<br>
<br>
You could use RTTI to implement such a predicate, although it will be more<br>
expensive than than the simple form above, e.g. something like:<br>
<br>
     :- pred ex_mul(ex::out) is multi.<br>
<br>
     ex_mul(V) :-<br>
         TypeDesc = type_desc.type_of(V),<br>
         NumFunctors = construct.det_num_functors(TypeDesc),<br>
         ( if<br>
            int.nondet_int_in_range(0, NumFunctors - 1, FunctorNum),<br>
            Univ = construct.construct(TypeDesc, FunctorNum, [])<br>
         then<br>
            univ.det_univ_to_type(Univ, V)<br>
         else<br>
            error("should not get here")<br>
        ).<br>
<br>
Julien.<br>
</blockquote></div>