[m-users.] How do you go about logging?

Left Right olegsivokon at gmail.com
Tue Apr 8 04:39:04 AEST 2014


Thank you for answers!
I'll keep on reading and advancing in small steps; it's ok :)

Best,

Oleg

On Mon, Apr 7, 2014 at 8:05 AM, Paul Bone <paul at bone.id.au> wrote:
> On Sun, Apr 06, 2014 at 09:20:54AM +0300, Left Right wrote:
>> Thanks for reply! But wouldn't you mind elaborating a bit? Here's what
>> I've tried, with the error message that resulted:
>>
>> % e3.m:011: Error: trailed mutable in non-trailing grade.
>> % e3.m:018: In clause for `nonedivides(in, out)':
>> % e3.m:018:   in argument 2 of call to predicate `io.write_string'/3:
>> % e3.m:018:   unique-mode error: the called procedure would clobber
>> its argument,
>> % e3.m:018:   but variable `STATE_VARIABLE_IO_9' is still live.
>> % e3.m:020:   The goal could not be reordered, because it was followed by an
>> % e3.m:020:   impure goal.
>> % e3.m:016:   This is the location of the impure goal.
>>
>> :- mutable(logging_level, int, 0, ground, []).
>>
>> :- pred nonedivides(int::in, list(int)::out) is semidet.
>> nonedivides(_, []).
>> nonedivides(Test, [Factor | Factors]):-
>>     trace [io(!IO), state(logging_level, !LoggingLevel)]
>>     (!.LoggingLevel > 1 ->
>>      io.write_string("Factor = ", !IO),
>>      io.write(Factor, !IO),
>>      io.nl(!IO) ; true),
>>     Factor mod Test \= 0, nonedivides(Test, Factors).
>>
>
> it might be simplier to avoid module local mutables for now.
>
> Try making the trace goal conditional on either a runtime or compile time
> flag instead.  For example:
>
> :- pred nonedivides(int::in, list(int)::out) is semidet.
>
> nonedivides(_, []).
> nonedivides(Test, [Factor | Factors]) :-
>     trace [io(!IO), compile_time(flag("debug"))] (
>         ( !.LoggingLevel > 1 ->
>             io.write_string("Factor = ", !IO),
>             io.write(Factor, !IO),
>             io.nl(!IO)
>         ;
>             true
>         )
>     ),
>     Factor mod Test \= 0, nonedivides(Test, Factors).
>
> Then add --trace-flag debug to the mmc command line to enable this trace
> goal.  One of the benifits of trace goals (rather than unchecked impurity)
> is that they 1) cannot bind variables 2) Can eaisly be turned off.  Combined
> this means that they're less likely to affect the program's semantics,
> unlike conditional compilation in languages like C.
>
> Note that this clearer syntax also makes the control flow of your
> if-then-else goal clearer to the reader (future you).
>
> Also your 3 calls to write out the status can be replaced with a single
> call:
>     io.format("Factor = %d\n", [i(Factor)], !IO)
>
> Thanks.
>
>
> --
> Paul Bone
> _______________________________________________
> users mailing list
> users at lists.mercurylang.org
> https://www.mercurylang.org/lists/listinfo/users



More information about the users mailing list