[MLton] cvs commit: world no longer contains a preprocessed basis library

Matthew Fluet fluet@cs.cornell.edu
Wed, 10 Dec 2003 17:27:26 -0500 (EST)


> Have you found any other NJ-isms in GenSML?

GenSML.gen has the type {use_toplocal : bool, ...} -> unit.

Setting use_toplocal to true means that  local .. in .. end  will be
inserted at every level; in particular, it means that signature and
functor declarations will be within the scope of a local.

Even if you set use_toplocal to false, GenSML.gen wraps the entire
generated program in a local .. in .. end, so you still end up with
signatures and functors within the scope of a local.

> I am trying to decide
> what to with the mention of cmcat in the MLton User Guide.
>
> 	http://www.mlton.org/user-guide/Porting_SML_NJ_CM.html
>
> Since cmcat requires SML/NJ 110.9.1, it's hardly a viable option for
> most people.  I would like to either replace the reference to cmcat
> with a discussion of GenSML, or at least add a paragraph on how to use
> GenSML to port from SML/NJ to MLton.  Matthew, could you write such a
> paragraph?

I'll think about what to say.  Note that GenSML.gen still doesn't produce
a whole program, because it doesn't chase other included CM libraries the
way cmcat would.  Also, because of the way SML/NJ now treats the basis as
just another CM library, we can't just keep chasing imports.

I think the best idea would be to hack GenSML into something that works
essentially like cmcat did.  I've already looked at it a little bit, so it
wouldn't be too hard.  It means that you would get out a single list of
files at the end of the day, with no scoping preservation.  So, you could
change the meaning of a program:

A.cm:  Group
         structure A
       is
         a/a.sml (* defines structure A *)

B.cm:  Group
         structure B
       is
         b/a.sml (* defines structure A *)
         b/b.sml (* defines structure B *)

C.cm:  Group
         structure C
       is
         A.cm
         c/c.sml (* defines structure C, using structure A *)


Z.cm:  Group
         structure Z
       is
         A.cm
         B.cm
         C.cm
         z/z.sml (* defines structure Z, using structures A, B, C *)


Running cmcat on Z.cm would yield
 a/a.sml
 b/a.sml
 b/b.sml
 c/c.sml
 z/z.sml

and the structures C and Z would incorrectly use the structure A defined
in b/a.sml.  Running GenSML.sml would do the appropriate renaming to
ensure that a/a.sml's structure A would not be overriden by b/b.sml.