[m-dev.] io__write et al

Fergus Henderson fjh at cs.mu.oz.au
Wed Apr 23 15:06:01 AEST 1997

Peter Schachte, you wrote:
> > > Shouldn't we start encouraging the notation `io:print'?
> > 
> > No.  That notation should be DIScouraged, because it is going to change
> > to `io.print'.  But of course we shouldn't start encouraging the notation
> > `io.print' until after we have implemented it...
> This doesn't seem like a good idea.
> What's the rationale for making this change?

The rationale is that this seems to be the best way of coming up with a simple,
consistent syntax for type qualification, module qualification, and records.

					Operator	Examples

	Module qualification:		.		module.name

	Type qualification:		:		expr : type

							:- type foo ---> foo(
							   field_name1 : type1,
							   field_name2 : type2

	Mode qualification:		::		:- pred p(type::mode).

I still haven't quite figured out what I think the best syntax is for all the
record operations, though.

> Firstly, it is error prone, as some
> people will tend to write io . print(...).

It may be a little confusing initially for some people, but I don't think
it will be error prone.  I think people will just get into the habit of
writing `io.print'.  I don't think this is the sort of mistake that any
given person would be likely to make often.
(Now comma as separator is error-prone...)

Anyway, if we are going to use dot as an operator despite this problem,
then module qualification is a good choice.

> Thirdly, does this mean that we can't use '.' as this list constructor
> anymore? Shouldn't io.print() be the list [io|print()]? 

You can't use infix '.' as the list constructor, but that is not a change;
that is enshrined in ISO Prolog, and has always been the case in Mercury.
If you want to use '.' as the list constructor, you have to write it prefix.

> Secondly, the infix dot
> notation is more orthodoxly used for structure member reference,

True, but many languages use it for both structure members and module

> Finally, colon is a much more conventional module qualification operator. 

Prolog is the only language I know that uses ":" as a module qualification

Language	Modules			Types			Structs
--------        -------                 -----                   -------
Haskell		module.member		expr::type		field record
Ada		package.member		var:type		record.field
Java		package.member		         		class.member
SML		structure.member	expr:type		record.field
Prolog		module:member
C++		namespace::member	         		class.member or
Perl		package::member

Fergus Henderson <fjh at cs.mu.oz.au>   |  "I have always known that the pursuit
WWW: <http://www.cs.mu.oz.au/~fjh>   |  of excellence is a lethal habit"
PGP: finger fjh at         |     -- the last words of T. S. Garp.

More information about the developers mailing list