[m-dev.] Re: [mercury-users] abstract types.

Peter Schachte schachte at cs.mu.OZ.AU
Wed Jan 19 00:03:51 AEDT 2000

On Tue, Jan 18, 2000 at 09:18:45AM +1100, Thomas Conway wrote:
> There's a bit of a problem in making bidirectional functions like this -
> apart from anything else, the code for \/ing the bits together doesn't
> work in the backwards mode (ie:
> 	lr1item(ProdNum, Dot, Sym) = Bits :-
> 		encode_sym(Sym, SymNum),
> 		Bits = (ProdNum << 20) \/ (Dot << 12) \/ SymNum.
> )

I've just submitted a new predicate for the int library module:

	% code(Factor, Value, Residue, Coding)
	% holds iff Factor*Value+Residue = Coding, and 0 <= Value < Factor.w
	% This is useful for things like converting between time as 
	% hours, minutes, and seconds, and raw seconds.

:- pred code(int, int, int, int).
:- mode code(in, in, in, out) is det.
:- mode code(in, out, out, in) is det.

This would let you write

	lr1item(ProdNum, Dot, Sym) = Bits :-
		encode_sym(Sym, SymNum),
		code(256, Dot, Prodnum, Bits0),
		code(4096, SymNum, Bits0, Bits).

and have it work in both modes.

BTW, this is implemented as you suggest with pragma C code, but it's
better to have that in one place, rather than repeated everywhere you
want to do this kind of encoding.

Peter Schachte                     The mind of a bigot is like the pupil of
mailto:schachte at cs.mu.OZ.AU        the eye. The more light you pour upon it,
http://www.cs.mu.oz.au/~schachte/  the more it will contract.
PGP: finger schachte at      -- Oliver Wendell Holmes Jr. 
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