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

Julien Fischer jfischer at opturion.com
Sun Apr 6 16:38:17 AEST 2014


Hi,

On Sun, 6 Apr 2014, 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.

Mutables are trailed by default, so if you want an untrailed mutable,
as here, it needs to be declared with the ``untrailed'' attribute, for
example:

     :- mutable(logging_level, int, 0, ground, [untrailed]).

> % 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.

Ugh!  That's all very mysterious.  What the compiler is trying to
complain about there is the fact the variable ``Factor'' has inst free
in the call to io.write/3.  Since the first argument of io.write/3 has
mode ``in'', it needs to ground.

I think the second mode in the declaration of nonedevices/2 is wrong,
it should be ``in'' not ``out''.

>
> :- 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).

Cheers,
Julien.



More information about the users mailing list