[m-users.] boiler plate reduction, or leave it alone as 'self documenting code' ?

Sean Charles (emacstheviking) objitsu at gmail.com
Sat Nov 5 20:00:17 AEDT 2022


Yes, that would def. work!

:D

Thanks Zoltan, sometimes the obvious things aren't that obvious...

Sean


> On 5 Nov 2022, at 08:58, Zoltan Somogyi <zoltan.somogyi at runbox.com> wrote:
> 
> 
> 
> On Sat, 5 Nov 2022 08:44:52 +0000, "Sean Charles (emacstheviking)" <objitsu at gmail.com> wrote:
> 
>> The idea was to take the above function and refactor like this, passing in the term...
>> 
>> tr_inclusions(Pos, Body, Term, Out) :-
>>    Len = list.length(Body),
>>    ( if Len > 0 then
>>        convert_terms(Body, Res),
>>        (
>>            Res = ok(TrInst),
>>            Out = ok(Term)
>>        ;
>>            Res = error(Errors),
>>            Out = error(Errors)
>>        )
>>    else
>>        Out = checkfail(Pos, require_form_error)
>>    ).
>> 
>> ... tr_inclusions(Pos, Body, t_require(Pos, HOLE), Out)
>> 
>> but I can't use an unbound variable on those constructors
>> as they have to be fully instatiated and how would I know
>> where to put TrInst anyway when composing the returned value?
> 
> It is possible to express this in Mercury, but that does not matter,
> because the compiler cannot modecheck code that fills in
> partially instantiated data structures.
> 
> What you want seems to be a way to use the same code
> to handle four constructs for which the code is all but identical,
> differing only in the function symbol you want to wrap around
> two terms. You can do that using code like this:
> 
> :- type require_kind
>    --->    rk_req
>    ;       rk_req_once
>    ;       rk_incl
>    ;       rk_incl_once.
> 
> syntax_require(Pos, Kind, Body, Out) :-
>    Len = list.length(Body),
>    ( if Len > 0 then
>        convert_terms(Body, Res),
>        (
>            Res = ok(TrInst),
>            ( Kind = rk_req,       Req = t_require(Pos, TrInst)
>            ; Kind = rk_req_one,   Req = t_require_once(Pos, TrInst)
>            ; Kind = rk_incl,      Req = t_include(Pos, TrInst)
>            ; Kind = rk_incl_once, Req = t_include_once(Pos, TrInst)
>            ),
>            Out = ok(Req)
>        ;
>            Res = error(Errors),
>            Out = error(Errors)
>        )
>    else
>        Out = checkfail(Pos, require_form_error)
>    ).
> 
> This is not quite as elegant, but it should work.
> 
> Zoltan.



More information about the users mailing list