[mercury-users] Conditional compilation

Zoltan Somogyi zs at cs.mu.OZ.AU
Tue Aug 16 17:10:30 AEST 2005


On 16-Aug-2005, Peter Hawkins <peter at hawkins.emu.id.au> wrote:
> :- pred debugging is semidet.
> debugging :- semidet_fail.
> or
> debugging :- semidet_succeed.
> 
> main(!IO) :-
>    (if debugging then
>       do stuff
>     else
>       true
>    )
> 
> Unfortunately the mercury compiler doesn't optimize away the 
> if-then-else, even if I add a :- pragma inline to the debugging 
> predicate.

That's because the compiler doesn't know that semidet_fail always fails
and semidet_succeed always succeeds; if it did, that would undo a large
part of their usefulness.

You can get what you want with

	:- func debugging = bool.

	debugging = yes.		% or no

 	main(!IO) :-
		Debugging = debugging,
		(
			Debugging = yes,
			do stuff
		;
			Debugging = no
		).

This is probably easier than Ralph's suggestion. If the optimization level
is high enough to invoke inlining, Mercury will delete the unreachable arm
of the switch.

Zoltan.
--------------------------------------------------------------------------
mercury-users mailing list
post:  mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-users-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------



More information about the users mailing list