Standard ML of New Jersey, Version 0.74, 10 October, 1991

Bugs fixed:
451. sharing constraints
453. unhandled exception crashes sml
-------------------------------------------------------------------------

Standard ML of New Jersey, Version 0.74, 10 October, 1991

Changes since 0.70:

  System.system now has the signature
    val system : string -> int
  where it returns the Unix status code of the sub-process.

  The IO.execute function has a different signature and two forms:
    val execute : (string * string list) -> (instream * outstream)
    val execute_in_env : (string * string list * string list)
          -> (instream * outstream)
  The first of these allows command-line arguments to be passed
  to the  program; the second also allows an environment to be
  specified.  In both cases, the base name of the first argument
  is prepended to the argument list.

  The module system has been reimplemented.

  Structure Compile added to pervasives to support Gene Rollins'
  sourcegroups separate compilation system.

Bugs fixed:
253. SML Dumping core compiling mlyacc with -pervshare
274. weakness lost with flex record pattern
283. openread (run.c) checking
294. weak polymorphic types
306. list printing, printlength
321. top level polymorphic exceptions allowed
334. adjust_limit in M68.prim.s
335. Dave Berry's library won't compile
337. double error message
342. execute destroys the unix-environment
354. SIGILL bug on SPARC (actually fixed in 0.70)
393. type abbreviations not transparent
407. create_v_v for SPARC
410. inlining property not preserved in simple renaming
413. System and IO problems
414. getWD wrong
418. repeated type names in type declarations
419. Runbind
422. overflow on int to real conversion
424. IO.execute on SPARC
426. type printing
427. Compiler bug: defineEqTycon/eqtyc
431. ml_writev
432. corrupted (shell) environment
433. lexgen bug
435. patrow syntax
439. lexgen
441. parsing large positive integers
444. large constants and Overflow
447. identity type abbreviation

----------------------------------------------------------------------
Standard ML of New Jersey, Version 0.73, 10 September 1991

Changes since 0.70:

Arrays now follow the new "standard" agreed on by all implementors:
structure Array is no longer open by default, sub must be infixed
by the user. There is also a new Vector structure for immutable arrays.
See doc/array. Floating arrays have been implemented.

Two new primops have been added to support floating arrays 
and an assembly routine for vector creation.

The module system is internally rewritten, and should be more
robust and efficient.

System.Control.timings used to print timings
under the title 'codegen:' twice. One was really generic 
and the other was the sum from convert through to the end 
of scheduling/backpatching. The first is renamed to be 'generic:'.

Large number of changes have been made to the runtime system
to support multiprocessing. The main change is that all runtime 
globals have been added to the MLState vector. A pointer to the  
MLState vector is saved on the stack and is now passed as an 
arguement to all the runtime routines  that uses its components.

Multiprocessing specific support routines (e.g., g.c.) have 
been added.


Bugs fixed:

4. duplicate specifications not checked
242. incorrect forward referencing allowed
267. sharing again
276. overriding included value spec
277. incorrect "inconsistent equality property" error
280. included infix specs not printed
281. Import bombs out when it can't find files.
296. patch for HP/MORE
301. Compiler bug: tycPath
303. bad error reporting
304. SIGEMT on sparc
307. signature matching in 0.69
319. bad weakness degree (not weak enough)
324. bulletproofWrite dies in a bad way when out of disk space
330. comments bug
349. function names in FUN not checked for uniqueness
359. indexing 
361. Error: Compiler bug: Functor.applyFunctor.insttyc
365. fixed size of tuples causes bug
366. lookahead
368. missing exceptions
369. bug in MLYACC
370. Wrong definition of div & mod in perv.sml
373. bug in printing fully qualified structure names
374. mod overflows on some negative numbers
377. prop.sml has bug
378. Error: Compiler bug: Functor.applyFunctor.redoTycs 1
382. missing \n on infix echo
383. open in nested structures fails with "Runbind"
386. printing bug with abstype
391. truncate
400. problem parsing weak types
404. std_out not flushed on read from std_in
405. identifiers starting with underscores are incorrectly allowed
406. funny signatures in 0.71

--------------------------------------------------------------
Standard ML of New Jersey, Version 0.70, 1 July 1991

Changes since 0.69:

Support for NeXT version 2.0.  

Callee-save registers (for 7% better performance on MIPS and 18% on SPARC).

In-line array update and subscript (for 25% better performance on
"real" programs that use arrays; program that do nothing but array accesses
are twice as fast).

Experimental new primitives "getvar" and "setvar" intended for use
in multiprocessor versions of SML/NJ.

Bug fixes:
86. incorrectly allows redefining of "="
221. profiling broken
272. generalizing user bound type variables
276. weak polymorphism
286. Compiler bug: inststr NULLstr
308. Mips RC6280 code generation bug  (but 6280 still has other problems)
309: NeXTstation exported image doesn't work
320. bad weakness degree (too weak)
347. dec function in fastlib wrong
348. connect_inet bug 
351. gc messages bug
352. gc statistics bug
363. bug in 0.69 interpreter
364. bug in lexgen doc
380. regbind compiler bug
384. signal handler never re-installed
389. stats 
397. Unsafe.update with constant
Various flake-outs with ML signal-handlers have been fixed.
---------------------------------------------------------------------
Standard ML of New Jersey, Version 0.69, 3 April 1991

Changes since 0.66:

Floating-point programs should run twice as fast (thanks to Lal George).

Conforms more closely to the syntax in the Definition, so that
1+if... doesn't work anymore; use parentheses:  1+(if...)
Similarly for "case" and "fn".

New primitives "capture" and "escape" that are like callcc
and throw but do NOT preserve the exception handler of the saved
continuation.  

Hexadecimal integer literals like 0x5e48.  

Lots of minor bug fixes:

231. equality property of DEFtyc
243. include compiler bug
288.  extraneous "match not exhaustive" warning
289. 0.65 prerelease  core dumps
295. Compiler bug: r_o in mcopt
300. uncaught exceptin RegBind
305. Strange floating point error
311. abstype bug
318. rebinding of type operator "*"
326.  very big arrays
327. large constants cause overflow in compilation
328. callcc not tail recursive
329. checkopen broken
331. type variable generalized wrongly
333. code generation bug
339. type = allowed
357. import broken
358. import & pervasives
362. missing primop in interp
367. Decstation mach recompolation to m68
372. open in signature causes compiler bug
375. overflow bugs
376b. parsing
385. SIGHUP, SIGQUIT, SIGTERM ignored sometimes
387. arrays on Sparc
388. * as label of record
392. two type constraints
394. strange message in 0.66 typechecker
396. unbound variables should have type ERRORty
399. Vax dumps core
401. Imperative types in SML/NJ 0.66
403. 0.0/0.0 not properly handled
---------------------------------------------------------------------
Standard ML of New Jersey, Version 0.66, 2 October 1990

Changes since 0.65:
1) added exception Interrupt to General.  This was done so that programs
  that use Interrupt in patterns won't break.  The exception is NEVER
  raised by the run-time.  The signals mechanism should be used to handle
  SIGINT, but see doc/SIGINT for a simple way of modifying a top-level
  loop to deal with SIGINT.

2) added the function "pause" to System.Signals.  This is essentially the
  UNIX sigpause(2) system call.  It blocks SML until a signal occurs.

3) The BASICIO signature (which was empty) was removed from perv.sig.

Bug fixes:

275. illegal token with structure named ?
277. incorrect "inconsistent equality property" error
279. big integers causing uncaught exception
287. cosine function incorrectly defined
---------------------------------------------------------------------
Standard ML of New Jersey, Version 0.65, 10 September 1990

New features:

A new outstream, std_err, has been added to the IO structure.  It is
connected to the standard UNIX error stream.

There is now a general mechanism for handling UNIX signals.  The file
doc/papers/ml-signals.ps is the postscript for a paper that describes
the mechanism (Cornell University TR 90-1144).

Bugs fixed:  (complete descriptions are in doc/masterbugs)
223. nontty standard input and uncaught exceptions
232. user bound type variable in exception declaration 
234/261. Compiler Bug: abstractBody.abstractType 1
235. repeated type variables in typdesc and datdesc
241. sharing constraint error ignored
244. compiler bug on product of large integer constants on SPARC
245. NeXT installation problem
247. close_out std_out [not considered a bug]
250. interpreter broken
251. omits tests for repeated bindings
255. space leak with redeclaration of variables
256. mcopt compiler bug with improper function definition
258. System.Directory.cd failure
262. Using the LIBRARY with v0.62 (Runbind)
263. problem with input via datakit con
265. strong type variables accepted in exception declarations
266. Io exception raised by "use"
268. import, equality
269. failure in abstractBody with embedded signature
270. Compiler bug: TypesUtil.lookTycPath: NULLstr 
271. secondary compiler bug

---------------------------------------------------------------------------
Standard ML of New Jersey, Version 0.64, 25 August 1990

The compiler and user programs should use a bit less memory, as the
collector finds more garbage.  Compilation is faster, and there
are significant performance improvements in the SPARC and MIPS code
generators.

A preliminary version of the ML debugger, thanks to Andrew Tolmach,
is released with this version.  See doc/debug and lib/emacs for
details.  Warning:  using the debugger increases memory requirements
and compilation time substantially.

Bugs fixed:  (complete descriptions are in doc/masterbugs)
12. loss of information in value printing
182. uncaught exception after exportFn
185. exportML size  (negative percentages in g.c. messages)
186. type error matching against bogus tycon
205. performance problem with many opens in a structure
208. bug in optimizer causing bad free variable
213. equality on int*int  (new with 0.56)
214. Compiler bug: EnvAccess.lookPath when printing  (new with 0.56)
215. sin gives incorrect values
216. floating point on SPARC
217. simultaneous opens  (new with 0.56)
218. compiler bug after unbound variable  (new with 0.57)
220. Match exception after error
225. import broken in 0.59
227. equality property of datatypes
230. printing reals on mips
231. equality property of DEFtyc
233. opening locally declared structure causes Runbind
236. Mach problems in 0.59
237. Can't parse most-negative integer constant
238. div is unreliable at extremes
239. INCONSISTENT exception raised in sharing analysis
240. concrete printing of abstype value
243. include compiler bug
248. abstract types are not abstract
249. separate compilation printing problems
252. include broken in 0.59  (simplified version of 243.)
254. failure to detect type error
260. failure to raise overflow

---------------------------------------------------------------------------
Standard ML of New Jersey, Version 0.56, April 1990
 
The system now runs on MIPS-based computers: 
	- MIPS computers running RISCos    (makeml -mips -riscos)
	- DEC 5400, 3100, 5800, etc. running Ultrix  (makeml -mips -bsd)
	Thanks to Norman Ramsey for this implementation.

Installation note:  The makeml script has changed slightly; look at makeml.1.

We have re-arranged our initial environment to conform better to
the Definition of Standard ML.  In particular:

Arithmetic exceptions:
	Sum, Prod, Diff, Neg, Exp, Floor are all equivalent to Overflow
	Div and Mod are equivalent, distinct from Overflow
	Ln is a distinct exception; Sqrt is a distinct exception	
   The exception "Real of string" is gone.  Real overflows raise Overflow,
	real underflows return 0.0 with no exception, and real divide-by-zero
	raises Div.
Div and Mod:
	Now work according to the definition, but are much slower.
	The old (faster, rounding towards zero) behavior can be had
	by using the new infixed operators, "quot" and "rem".
Input and output:
	The functions input and output are now uncurried:
		output: outstream * string -> unit
		input:  instream * int -> string
	There are two new functions:
		outputc =  curry(output)
		inputc:   a curried input function, but with a difference:
			inputc f n 
			returns "" on end-of-stream, and otherwise
			returns a string of length k, 0<k<=n,
			depending on what is available and convenient.

Remaining deviations from the Definition:

- The arithmetic overflow exceptions are all identified (see above).
- Strings carried by the Io exception are more informative in SML-NJ.
- Different right-associative operators of the same precedence
	associate to the right in SML-NJ.
- The @ operator is right-associative in SML-NJ.
- "local" and "open" specs in signatures have a different semantics
		(see doc/localspec)
- The symbol "=" can be re-bound (though usually you get a warning message)
- The construct   val ... and rec ...   is not permitted; the "rec"
	must immediately follow the "val".
- The Definition prohibits some, but not all, signatures that could
	never be matched by any structure.  We are more liberal about
	such signatures.
- The initial basis is a superset of the one described in the Definition.

The System structure in the initial environment has been re-arranged
slightly; see src/boot/system.sig.  In particular, "cd" is now
accessible as System.Directory.cd.

We know of two operating system bugs:
        A floating point exception will hang the machine in Ultrix V3.1A 
   (Rev. 26) on the DEC 5400. This is an older release of Ultrix, 
   and newer versions fix the problem.
        The "select" system call is unreliable on pipes in RISCos 4.20;
   as a result, you may have to press carriage-return after control-C
   to generate an interrupt.  We have reported this bug to MIPS.

Bugs fixed:  (complete descriptions are in doc/masterbugs)

26. export ML within a use
36. overloading resolution and order of recursive definitions
40. Exception aliasing (match compiler)
46. equality type checking and flexrecords
68. spurious error message -- doesn't match sig spec
69. printing of exn spec in inferred signature
70, 204.  constructor shouldn't appear in printed structure signature
72. equality types with abstype declarations
80. simultaneous type declarations
85. bad error message for failed signature match
101. Duplicate labels (in either types or values) are not detected
102. One-tuples are not printed sensibly.
103. Space missing in an error message (which might be more informative).
104. Labels with leading zeroes should not be accepted
106. Something strange is happening with "it".
107. NJML disappears ... when trying to parse large real numbers
108. More faulty error recovery?
109. sharing of datatypes not handled properly
117. sharing and equality attributes
118. deviation from Definition, div and mod
119. deviation from Definition  (input and output curried)
122. Unimplemented parts of Standard  (let and local for structures)
123. error recovery
124. compiler bug after incomplete qualified identifier
126.  scope of explicit type variables
127. sharing and equality types
128. question mark as reserved word
133. overloading resolution is weaker than Edinburgh SML or Poly ML
135. eqtype vs abstype
138. numeric labels not equivalent to tuples
140. comment to end of file  (see also bug 64)
141. interrupting gc dumps core
151. can't limit length of list printed
       System.Control.Print.printLength : int ref  
       now controls number of elements printed in a long list.  Default is 12.
153. interrupting coroutine loop dumps core
155. Compiler bug caused by of missing structure
160. errorty fails to match sig spec 
167. repeated bound type variables in type declaration
169. inferring eqtypes in signatures
171. illegal datatype declaration accepted
172. functor subscript error
173. Runbind
174. import and types
177. clinkdata on sun 3
179. compiler bug (783 in sigmatch)
181. 8-bit characters not supported in strings
183. "raise" not synchronized with evaluation sequence
187. parsing clausal definitions with infix functions
188. infinite loop parsing simple functor declaration
190. unclosed string in interactive system
191. Real operators permuted
192. bad parsing
193. import types
194. weak type variable syntax 
195. Compiler bug: abstractType
196. Compiler bug: generalizeTy -- bad arg
197. exportFn size
198. printing exception specs in signatures
200. large interger literals
203. printing of infix specs in signatures
*.   Bugs concerning the relation of functor-result signatures to 
       functor-parameter signatures are fixed.
*.   The most-negative-integer can now be printed without overflowing.
*.   Warning messages from the match compiler, the overloading resolver,
       and the typechecker pinpoint the site of the error much more accurately.

Bugs re-classified:  (complete descriptions are in doc/masterbugs)
7. constructor representation
	This now gives an error message when a user stumbles across it
	(which is exceedingly rare).  Also, we believe this is an inherent
	problem with the language, not with our compiler.
10. exhaustiveness message at top-level.
	This is a feature.
20. "print" is overloaded rather than polymorphic
	This is a feature.  The Definition makes no mention of "print".
24.  incomplete write
	This is removed from the list; our new signal-handling
	system provides more appropriate primitives to solve this problem.
86, 132. incorrectly allows redefining of "="
	Perhaps we should fix this, but it's not important to us.
87. execute subprocess dies on interrupt on blocked input
	This is a feature (of Unix), not a bug.
105. Large numeric labels are disallowed.    
	Tough luck.  We're not going to fix this.
110. val rec
	This is a silliness in the Definition; we're not going to "fix" it.
111. local polymorphic definitions
	This is not a bug; if we allow this, the type system is unsafe:
     local exception X of '_a in val exn0 = X(3) fun h(X(b:bool)) = b end;
     raise exn0 handle e => h(e);
115. cyclic signatures
	We reserve the right to accept some signatures, even if there's
	no structure that they could match.
116. pattern declares no variables warning (?)
	This is a feature.  Can't you tell?
120. deviation from Definition (arithmetic exceptions)
	This is fixed, after a fashion;  see above.
121. Unimplemented parts of Standard (open specs)
	See doc/localspec
122. Unimplemented parts of Standard (local specs)
	See doc/localspec
164. NS32 in makeml
	We are not currently supporting the NS32000 architecture,
	but we may again support it with cooperation from users.

The typechecker and match compiler give much more informative messages
if System.Control.markabsyn is true.  Unfortunately this requires
(even) more memory.

The debugger (courtesy of Andrew Tolmach) is present in the source, but
does not yet work and is not installed.

The internal representation of first-class continuations is more explicit
about exception-handlers; this will be useful for the new signal-handler
mechanism.

The type-checker is much cleaned up.  User-bound type variables don't appear
in global symbol tables.

Minor (unreported) bugs in the precedence parser and SPARC code generators
are fixed.

---------------------------------------------------------------------------
Standard ML of New Jersey version 0.49, 26 January 1990

New Parser:  The parser is now completely rewritten, using the parser
generator developed by David Tarditi and Andrew Appel.  It's a bit
slower and a bit bigger (though we're working on these problems), but
it generates significantly better error messages and error recovery.
It's also more maintainable.

ML now runs on 68020-based HP workstations running either HP-UX or MORE.

Making sharable images:
There is now a new version of "linkdata", called "clinkdata", that
is relatively machine- and operating-system-independent, but
is much faster than the old "slinkdata".  This will be of interest to
NeXT users, MIPS users, and other users of operating systems where
the "a.out" format is different from Berkeley Unix.  The "makeml"
file now uses "clinkdata" instead of "slinkdata" for such machines.

Bug fixes---many bugs are fixed, including:

2. (L.3):  Mispelled nonnullary constructors in patterns [parser]
8. (L.9):  interactive error recovery
11. (L.12):  poor error messages [parser]
15. (E.12):  Error message
17. (E.25):  Inaccurate line numbers
29. (E.62):  use_string in structure definition
48. printing of identity withtype declarations
63. curried, clausal def of infix function
70. (E.74) constructor shouldn't appear in printed structure signature
71. (E.75) Failure to restore enviroment after exception in "use"
73. strange function definition
77. unparenthesized infix expressions in fun lhs
79. withtype
83. unexpected parsing of erroneous datatype declaration
89. continuation line string escape at beginning of string
90. secondary prompt is not set in multi-line strings and comments.
95. infix declaration interferes with type parsing
100. constructor not printed after open declaration
112. equality of ~0.0 and ~ 0.0
113. empty declarations
117. sharing and equality attributes
134. type checking
136. linkdata problem
145. stale top-level continuations cause type bugs
150. incomplete sharing spec accepted
152. floating point errors (wasn't a bug)
154. import smashing memory (fixed in 0.44a, actually)
156. confusing parser error message
157. nested imports corrupt memory (same as 154)
162. ByteArray subscript exception expected (wasn't a bug)
163. function definition syntax
170.  error in makeml script 
201. funny tycon aliasing behavior
202. type error not caught?
204. constructors printed when not accessible
. Runs on NeXT machine (there was a bug in makeml)
. Runs on HP workstation (68020-based)
. exportFn images will never include the compiler, as they sometimes did.

------------------------------------------------------------------------------
Standard ML of New Jersey version 0.44, 4 December 1989

New release:

Starting with this release, the compiler source code is covered by an AT&T
copyright notice, which is included in each source code file.  The file
doc/COPYRIGHT contains the official copyright notice, license, and
disclaimer.  The file doc/release-form contains a release form that our
lawyer would like you to sign if you contribute software or modifications
that are included in the distribution.  Whether you sign it as an
individual or get your institution to sign it is your decision, but it is
undoubtedly quicker and simpler to sign as an individual.  The release form
is not necessary for simple bug fixes.

Mailing list:

There is now a Standard ML mailing list for messages and queries of general
interest to the ML community.  You can join by sending a request to
sml-request@cs.cmu.edu, and you can send a message to the list by mailing
to sml@cs.cmu.edu.  This mailing list will be the main vehicle for
distributing announcements about Standard ML of New Jersey.

Modules:

All known major bugs in the module system have been fixed, so please report
any new bugs or old bugs we missed.  The full module syntax from the
Definition, Version 3 is now implemented with minor limitations or
extensions, including let structure expressions and local and open
signature specs (see comments in doc/localspec).  Include specs work
properly once again.

Local and open specs:

David MacQueen has some comments about "local" and "open" specifications
in signatures; see doc/localspec.

Weak type variable syntax:

Standard ML of New Jersey has a more precise system for weak typing
(i.e. typechecking of programs that use semi-polymorphic reference
variables).  Other compilers denote weak type variables with an underscore,
i.e. '_abc, while ours uses an initial integer to denote level of weakness,
i.e. '2abc.  See doc/weak-types for a fuller explanation.  However,
for compatibility:
  The notation for weak type variables using an initial underscore is now
supported for input and output.  A weak type variable of the form '_a
is equivalent to the numeric form '1a.  On output, weak type variables
are printed using an initial integer.  However, if the ref variable 
System.Control.weakUnderscore is set to true, then weak type variables
of all levels are printed with an underscore.

Equality types:

Equality types are still broken.  Fixing these is the next order of business.

Import:

Nested imports do not work reliably in this version.

Optimizing compiler:

Hints on making your programs run faster are in doc/optimize.

Miscellaneous:

The SPARC code generator has been completely rewritten by John Reppy.

Bruce Duba continues to make improvements to the CPS code generator.

Andrew Appel is re-writing the parser to use David Tarditi's newest
version of the ML parser generator; this re-write is not complete but
the source files are included (along with the working recursive descent
parser) in src/parse/.

Linkdata:

The "linkdata" program, used for making a sharable version of the ML
compiler by putting all the .mo files into the text segment, did not work
on all operating systems.  There is a more portable, albeit much less
efficient, version of linkdata called "slinkdata".  Look in "src/makeml" to
see how it is used for the NeXT operating system, and you can use it that
way for your operating system too.  (Admittedly, this is very minimal
documentation!)

Bug fixes:

See latest doc/bugs file for remaining bugs.  This has been brought more or
less up to date.  We appreciate your bug reports and hope you will be 
patient as we work our way through them.  There is a new version of the
bug report format file (doc/bug.form), including a new "Severity:" field
that you should use to indicate how serious the bug is from your point of
view.  We get a lot of bug reports (which is good!) but we may not assign
the right priority to them without your help.

Version 1 plan:

Our tentative schedule calls for the release of version 1 of the compiler in
mid-January 1990.  There will probably be one more beta release between now
and then.  This is a more or less arbitrary deadline, and we will try to fix
as many bugs as possible before version 1 is released.  Development of the
compiler will continue as usual following this milestone, and major, widely
publicized releases will occur on a more regular and less frequent schedule,
e.g. perhaps three times a year.  Interim developmental versions can be made
available to those who have a special need for them.

------------------------------------------------------------------------------
Standard ML of New Jersey version 0.42, 27 October 1989

Release notes by Andrew Appel, covering changes since version 0.39.

Bug fixes:

Large floating point literals do the right thing now, at least on the Vax.

Duplicate constructor names and field names are again detected.

Printing of records like {1="abc"} works correctly.

Reading 1025 bytes from standard input works.

Large list expressions of the form [(0,0),(0,0),(0,0), ..... (0,0)] no longer
   cause the compiler to blow up.

Previous versions have run on Sun-3s with Mach, this version might work
on Vaxes with Mach.  The next version should run on anything with Mach.

Compile-time processing of functors has been extensively rewritten,
and should be more robust.  There are still some remaining bugs, however,
which should now be easy to iron out.

The Io exception now carries a much more useful string value, containing
all sorts of information.

Other changes since version 0.39 are mostly of interest to implementors.
VALvars and STRvars now have qualids instead of ids, lexer interface
parametrized more cleanly.  Page-faulting is no longer used to detect
end-of-memory on most machines.

---------------------------------------------------------------------------
Standard ML of New Jersey version 0.39, 8 September 1989

This notes overlap with the 0.36 release notes, since 0.36 was not
widely distributed [neither were 0.37 or 0.38].

Release notes by Andrew Appel.

Changes since version 0.33:

1.  Support for Sun-4 (SPARC) thanks to John Reppy at Cornell;
    Encore (NS32032), NeXT (also Mach on other 68020 machines), and 
    Sony NEWS (68020-based workstation), thanks to James O'Toole at MIT.

2.  An interpreter for faster compilation (4x) but slower execution (18x).
    Set System.Control.interp := true to enable this mode.  Use the -i
    or -ionly to makeml to set this option as the default.

3.  Delay and Force primitives (meant for internal use only) for research
    in lazy evaluation.

4.  Bug fixes:   reading 2049-byte files works now.  Separate compilation
    shouldn't dump core.  Miscellaneous others.

5.  A code generator generator implemented by Johan Lilius,
    Jari Porra, & Jussi Rintanen of Helsinki University of Technology 
    is include in the Standard ML Software Library: see lib/twig.

6.  Various internal efficiency improvements; the CMACHINE signature was
    simplified a bit; the format of generational-gc update lists was changed;
    the CPS optimizer was beefed up.

7.  Separate compilation has been improved.  The compiled version of a 
    separately compiled file has the extension ".bin", and internally
    identifies the version of SML-NJ and also the machine type it 
    runs on.  The command "head -1 foo.bin" will print this information.

8.  Many functor bugs have been fixed.

9.  An improved version of ML-Yacc by David Tarditi at Princeton is provided,
    more efficient and with a better interface, and with sophisticated syntax
    error recovery.

Forthcoming in future releases:

- Mach support for Vax and other machines.

- Some work has been done on a MacIntosh II port, and we are hoping for
volunteers to continue this work.

- Our MIPS code generator almost works now (thanks to Norman Ramsey at
Princeton).

-----------------------------------------------------------------------------
What's new in SML of NJ Version 0.33, 1 April 1989

1. CPS code generator

This version uses a new CPS (Continuation Passing Style) code
generator.  The CPS code generator differs from the older code
generator in the following ways:

   (i) The code produced is about 50% faster.

   (ii) The compiler generates code about half as quickly (this should
gradually improve with future releases).

   (iii) the new code generator does not use a stack.  This makes it easier
to support experimental features like callcc and multiple processes.
It also makes efficient garbage collection even more critical.

   (iv) The cps code generator tends to build larger intermediate
representations, so tuning of the runtime system becomes more
important.  See the discussion of memory management in doc/INSTALL.


2. The runtime system

The runtime system has been extensively rewritten and cleaned up.  The
amount of assembly code has been reduced (only 220 lines for the Vax,
385 for the Sun), and the system call interface has been simplified.  The
mechanism for initiating garbage collection has been made more robust.
In the m68 version (for Sun 3), exhaustion of free space is detected
by an explicit comparison rather than by trapping a segmentation fault.
This finally eliminates persistent flakiness caused by the way the 68020
recovers from segmentation faults.

LaTeX source for a new paper describing the runtime system can be
found in doc/papers/runtime.  This is still an early draft, but it should
be helpful in understanding internals of the run time system.


3. The pervasive environment

The initial environment has been reorganized to make it possible to
build a system whose pervasives (i.e., built-in bindings) correspond
closely to those described in "The Definition of Standard ML, Version
2" by R. Harper, R. Milner, and M. Tofte (ECS-LFCS-88-62, August 1988,
hereafter referred to as the "Definition").  Note that in our humble
opinion the "standard" environment is somewhat brain-damaged and is
missing many important features (like arrays, bytearrays, etc).  See
the file doc/environ for discussion of specific deficiencies of the
environment described in the Definition and our proposed fixes, some
of which are incorporated in the "New Jersey" environment.

The default initial environment set up by the bootstrapping process is
the richer, and more efficient, New Jersey environment.  However,
loading the source file src/lib/standard.sml defines a structure named
Standard that provides a close approximation to the "standard"
environment.  Opening the structure Standard at the top level replaces
any nonstandard bindings in the New Jersey environment.  The New
Jersey environment is still there in the background, so any New Jersey
bindings not rebound in Standard will still be visible.  In the future
we may provide a mechanism (e.g. a function switchEnv: string -> unit)
for completely replacing the base environment with a different version
specified by a structure.  For example, `switchEnv "Standard"' would
replace the existing base environment with the contents of Standard.

The initial environment also contains:

(1) The signatures ARRAY, BASICIO, BITS, BOOL, BYTEARRAY, GENERAL, IO,
    INTEGER, LIST, REF, STRING, and REAL as defined in src/boot/perv.sig, 
    and the signature SYSTEM as defined in src/boot/system.sig

(2) The structures Array : ARRAY, BasicIO : BASICIO, Bits : BITS, etc.
    These contain the New Jersey versions of bindings.

(3) The structure NewJersey, which contains the complete New Jersey initial
    environment except for the signatures in (1) above and the structure
    NewJersey itself.

It follows that even if Standard has been defined and opened, all New Jersey
bindings are available via the structure NewJersey, or alternatively via
the structures Array, IO, etc.

Here are some differences between the New Jersey and Standard environments:

  a.  The functions +, /, *, -, div, mod are an order of magnitude 
      slower in Standard than in the New Jersey environment.  This is
      because they are required to raise distinct exceptions (according
      to the Definition), and because the treatment of negative arguments
      of div and mod doesn't match what the hardware provides; that
      complicates their implementation.  The NewJersey functions all raise
      Overflow on results that won't fit in 31 bits (and Div on zero divisor
      for div and mod).

  b.  The functions div and mod return different results.

  c.  input and output are curried in NewJersey (and in the IO structure),
      but not in Standard.

  d.  The New Jersey environment has many more functions in it, as described
      in the appendix of our reference manual or the signatures in the files
      src/boot/perv.sig and src/boot/system.sig.

The New Jersey environment has changed slightly from previous releases,
mostly to make the it more compatible with the Definition [IMPORTANT --
THESE CHANGES MAY BREAK SOME PROGRAMS]:

  a.  The exception Io_failure has been renamed Io for consistency
      with the Definition.

  b.  The exception Float has been renamed Real.  Float is still defined
      as a synonym for Real.

  c.  The identifier "length" is no longer overloaded: use "size" or
      "String.size" for string lengths, "length" or "List.length" for
      list lengths, and "Array.length" for array lengths.

  d.  The functions "cd" and "system" are now components of the
      System structure.

  e.  Various components of the System structure have been moved
      into the System.Unsafe substructure, and are not recommended for
      casual use.

  f.  The print functions (Integer.print, Real.print, String.print,
      and the overloaded print), now return unit rather than their
      argument.  This is because we found that in our code virtually
      every call of print was followed by "; ()".

We plan to provide a definition of the NewJersey structure in terms of
the "standard" environment (analogous to the definition of Standard in
lib/src/standard.sml).  This structure would enable any Standard ML
system to run programs based on the New Jersey environment.  Such
programs should not reference the System structure, of course.

4. Command line arguments and Shell environment

System.argv : unit -> string list
System.environ : unit -> string list
 
are new functions that return the list of command line arguments and
the Unix shell environment, respectively.

5. First-class continuations: callcc, throw, and cont (experimental)

These are new experimental primitives to allow one to capture and use
"first-class continuations".  See the file doc/callcc for
documentation of these new facilities.

6. Separate compilation (experimental)

We have integrated code written by Nick Rothwell and Mads Tofte of
Edinburgh that provides a preliminary, experimental form of secure (type
checked) separate compilation.  There is a special declaration form:

   import "filename"

where "filename" is a string literal designating either a source file
filename.sml or a binary file filename.bin.  If only the source file
exists in the current directory, then it is compiled and the binary
version is created.  If the binary version exists, it is loaded
instead of the source file.

As a consequence of adding this new facility, the identifier "import"
has become a reserved word.  This may cause incompatibilities with
existing code.

7. mlyacc

The new directory src/lib/mlyacc contains a yacc-like parser generator
written in ML, with documentation.  The parser generator is used much
like the Unix yacc utility, and the grammar specification language is
essentially that of yacc.  The parser generator was written by David
Tarditi of Princeton, based on an earlier effort by Nick Rothwell.
Other, more sophisticated, interfaces to the parser generator will
probably be provided in future releases.  As before, the directory
src/lib/lexgen contains a lexical analyzer generator.

8. Fixes

A number of things that have been broken are now fixed.  This includes
the garbage collector for the Sun 3, floating point operations on the
Sun 3, exportFn, sqrt, and execute.  Unfortunately, many old bugs
remain and the error messages are just as bad as ever.  We expect the
next release to fix many of these problems.  Bug reports are welcome as
ever, as are bug fixes.

9. Things to come

John Reppy has ported SML of NJ to the Sun 4 (SPARC) architecture and
his code generator will be included in the next release.  A port to
the MIPS architecture (DECstation 3100 under Ultrix) is in the works
at Princeton, and a NeXT port is likely.  A port to the Mac II under
the native Mac OS may also appear soon.

We are working on a new licensing scheme similar to that used by the
Free Software Foundation.  We hope to have this approved within three
months, and we will keep you informed of new developments.

------------------------------------------------------------------------------
New features of SML of NJ Version 0.24 (November 22, 1988)

1. Profiler

A call-count and statistical profiler has been implemented.  See
operating instructions in the README file, and the paper provided in
src/doc/papers/profiling.


2. Runtime reorganization

The runtime system has been reorganized to reduce the need for assembly
language and provide a standard interface for Unix system calls and
C code.  It should become possible to add special purpose C code to
the runtime system, for instance to provide an X windows interface.
Many of the assembly language functions have been replaced by more
portible C implementations and uses of the system call interface.
See src/doc/VERSION.24 for some more details.


3. Memory Management tuning

The variable

  System.Control.Runtime.ratio : int ref

can be used to control the garbage collection behavior to some extent,
in conjunction with the Unix limit variable (in the csh).  See the
discussion in README.


4. Simple gnu emacs sml mode

A simple gnu emacs sml mode was contributed by Mitch Wand.  It can be
found in src/lib/sml.el.  If you have a better mode or make improvements
on this version, please send them in to macqueen@research.att.com for
inclusion in future releases.
--------------------------------------------------------------------------
New features of SML of NJ Version 0.22 (October 10, 1988)

This file describes the most notable changes since version 0.20.  (Version 0.21
was a local version that was not distributed.)


1. Bugs

A few bugs have been fixed; exportFn works again; the system runs under the
latest version (4.0) of Sun Unix on a Sun-3.  See src/doc/bugs for the
remaining known bugs.  The next release with many more bug fixes will
probably follow fairly shortly.


2. Sharable text segments

We now have an option to run sml with the compiler read-only and sharable
(in the Unix text segment).  This should help on systems where several
people are running sml at once, and also improves garbage-collector performance.
See src/doc/INSTALL for more info.


3. CPS code generator

We are including the source code for the new cps code generator with
this release for those who would like an early look at it.  This code
generator is still under development and works only on Vaxes at this
point.


4. Installation

The maker script for building the interactive image has been reorganized
and new scripts maker.batch and maker.run have been added to simplify
making batch systems and compiling the runtime system.  See src/doc/INSTALL
and src/doc/BATCHINSTALL for details.


5. Lexer generator

The directory src/lib is a new directory for contributed software.
The programs included here do not come under the terms of the AT&T
license.  The first contributed software is a lexical analyzer
generator similar to the Unix lex utility.  It is in src/lib/lexgen.
lexgen has been used to generate a new lexical analyzer for the
compiler.  The specification is in src/lex/ml.lex.


----------------------------------------------------------------------------
New features of SML of NJ Version 0.20

This file describes the most notable changes since version 0.18.  (Version 0.19
was a local version that was not distributed.)

1. Bugs

Quite a few bugs have been fixed, mostly relating to type checking and modules.
See src/doc/bugs for the remaining known bugs.  


2. Reference types

The typing of references and arrays is less restrictive.  For
instance, the following is now permitted, whereas it used to cause an
error message:

   let val r = ref [] in r := [1]; !r end;

Thus locally declared reference variables like r in this example do not
need to be explicitly constrained to have a monotype.


3. Equality types

Equality types are now implemented.  Equality types are those
"hereditarily concrete" types whose values admit structural equality.
The implementation of equality types involves the new signature
specification keyword "eqtype" indicating that the specified type
constructor admits equality, and special equality type variables
starting with double single quotes (e.g. ''a) that are restricted to
range over equality types.  

An equality type is one containing only type constructors that "support
equality".  The following type constructors support equality:

   int, string, real
   
   any datatype whose constuctor argument types are equality types
   (disregarding parameter type variables)

   record type constructors

   type constructors from functor parameters that are specified as eqtypes

In addition, any reference or array type is an equality type.

Abstract type constructors, "->", and exn do not support equality.


4. Include specifications in signatures

Include specifications allow one to include the specifications of a previously
defined signature in a new signature.  The syntax is 

   include SIG

where SIG is the name of a signature.  For example, given the declaration

   signature AA =
   sig 
     type t
     val x : t
   end

the declaration 

   signature BB =
   sig
     include AA
     val y : t -> int
   end

is equivalent to

   signature BB =
   sig
     type t
     val x : t
     val y : t -> int
   end


5. Free identifiers in signatures and structures

Structure definitions can now contain free identifiers of any sort
(values, constructors, exceptions, types), not just free signatures,
structures and functors.  Signature definitions can contain free
structure and type identifiers, as well as free signature identifiers.


6. Printing of signatures and structures

Signatures defined at top level are printed.  Structures defined at
top level have their signatures printed (currently in full -- in the
future only the name of the signature will be printed if it has one).
Printing of signatures can be turned off by setting the flag
System.Control.Print.signatures to false.


7. Memory management improvements

The runtime system manages memory better.  The system automatically
resizes the heap on startup and during collections, allowing the
system to perform more gracefully on systems with limited memory.

The behavior and type of the flag controlling gc messages has changed:

  System.Control.Runtime.gcmessages: int ref
    when 0, no messages are printed
    when 1, only major collections are reported
    when 2, major collections and heap resizings are reported
    when 3, minor and major collections and heap resizings are reported
