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

"Zoltan Somogyi" <[email protected]>
Newsgroups gmane.comp.lang.mercury.general
Message-ID <[email protected]>

On Sat, 5 Nov 2022 08:44:52 +0000, "Sean Charles (emacstheviking)" <[email protected]> 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.
_______________________________________________
users mailing list
[email protected]
https://lists.mercurylang.org/listinfo/users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.