[m-dev.] logging proposal

Julien Fischer juliensf at cs.mu.OZ.AU
Mon Mar 13 11:26:31 AEDT 2006


On Sun, 12 Mar 2006, Ian MacLarty wrote:

> Index: doc/reference_manual.texi
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/doc/reference_manual.texi,v
> retrieving revision 1.345
> diff -u -r1.345 reference_manual.texi
> --- doc/reference_manual.texi	8 Mar 2006 02:25:38 -0000	1.345
> +++ doc/reference_manual.texi	11 Mar 2006 14:29:07 -0000
> @@ -642,55 +642,6 @@
>
> +
> + at item @code{debug @var{Vars} @var{Goal}}
> +A goal used only for the purposes of debugging.
> + at var{Vars} is a list containing exactly two variables of the
> +type io.state.
> + at var{Goal} is a deterministic goal that may perform I/O using the

Presumably it may also be a cc_multi goal?

> +io.state variables in @var{Vars}.
> +When debug goals are disabled they are equivalent to the goal @samp{true}.
> +When debug goals are enabled they are equivalent to the impure goal
> + at code{impure make_io_state(IO0), Goal, impure consume_io_state(IO)}
> +where IO0 and IO are the names of the variables given in @var{Vars} and
> + at code{make_io_state/1} constructs a fake @code{io.state} variable and
> + at code{comsume_io_state/1} destroys the fake io.state, with the exception that
> +the impurity need not be propogated to the predicate the debug goal
> +appears in.

So for the purposes of code in these debug goals impurity is effectively
ignored?

>
>  @node State variables
> @@ -8819,6 +8833,50 @@
>  		impure Ys = map(ImpureFunc, Ys).
>  @end example
>
> + at node Debug goals
> + at section Debug goals
> +
> +Sometimes it is useful for a program to have side effects only for the purposes
> +of debugging.

It's also useful for other purposes, e.g. profiling.  Along that line I
would suggest that the following would also be useful:

	* a `debug' flag for the mutable declaration.  These mutables
	  would only exist when the boolean flag was set to true (and
	  can only be referred to from within debug goals).

	* some sort of `debug' flag for the initialise and finalise
          declarations.

> +For example you may wish to observe the state of an executing
> +program by printing out the values of certain variables at different points
> +of execution.
> +In these cases it is unnessecarily restrictive to either thread
> +an I/O state through all of your program
> +(the program may be non-determinstic),
> +or to use the impurity system to achive the desired side effects
> +(since then the impurity must be propogated to all ancestors of the
> +predicate(s) containing the impure debugging goals,
> +even when the program is not being debugged).
> +
> +The Mercury language therefore supports a special type of goal called a
> + at emph{debug goal} (@pxref{Goals}).
> +Each debug goal has access to its own pair of io.state variables.
> +
> +For example:
> +
> + at example
> +	:- pred perform_computation(float::in, float::out) is det.
> +
> +	perform_computation(Input, Output) :-
> +		do_complex_calculation(Input, Ouput),
> +		debug [!IO] (
> +			io.format("input = %.8f, output = %.8f\n",
> +				[f(Input), f(Output)], !IO)
> +		).
> + at end example
> +
> +Mercury compiler implemetations are required to support a boolean switch
> +which allows the user to enable or disable debug goals at compile time.
> +Debug goals only produce side effects if the compiler option to enable them is

I suggest: s/Mercury compiler implementations/Mercury implementations/

Julien.
--------------------------------------------------------------------------
mercury-developers mailing list
Post messages to:       mercury-developers at cs.mu.oz.au
Administrative Queries: owner-mercury-developers at cs.mu.oz.au
Subscriptions:          mercury-developers-request at cs.mu.oz.au
--------------------------------------------------------------------------



More information about the developers mailing list