Standard ML of New Jersey
Release Notes

Version 110.98
July 16, 2020


This release includes substantial improvements to the documentation (the SML/NJ Library is now mostly documented) as well as many small improvements to the SML/NJ Library, various improvements in other parts of the system, and bug fixes.

Future Plans

We are reworking the back-end of the compiler in preparation for migrating from our current MLRISC code generator to one based on LLVM. With that migration, we expect to drop support for all processors other than the x86-64 (aka amd64), but we plan to add support for the arm64 (aka AArch64).

If you are a user of SML/NJ on the Sparc, PowerPC, or 32-bit x86 and would like to see support for that system continued, please contact us.



Made the LambdaVar.lvar type abstract. This is an internal change that should not affect compiler behavior.

We have started a project to migrate the backend of SML/NJ to use the LLVM infrastructure for code generation. The prepare the ground for this migration, we have made a number of changes to the compiler internals:

  • Support for mapping the trigonometry functions sin, cos, and tan to hardware instructions on the x86 architecture has been removed. This change was made to simplify the code generator as we work on migrating to a new LLVM backend.

  • The SML operators div and mod have a floor rounding semantics instead of the truncation semantics supported by hardware. Previously, we relied on MLRISC to handle the implementation of these operators, but we now do that in a new lowering pass. We also added optimizations for when the second argument to div or mod is a power of two to the CPS contraction phase.

  • The lowering pass also lowers trapping conversions (CPS primops TEST and TESTU) such that they only involve conversions that can be checked using trapping add operations.


The MLRISC instruction selector for the x86 and amd64 targets erroneously assumed that the idiv instruction sets the OF (overflow) condition code when dividing the largest negative number by ~1. In fact, such a division operation traps, which is okay, because the runtime system maps the trap to the Overflow exception. Since the check for overflow is unnecessary, it has been removed from the files MLRISC/amd64/mltree/amd64-gen.sml and MLRISC/x86/mltree/x86.sml.

Basis Library

This version implements the following Basis Library proposal:


Basis Library proposal 2020-001 (Addition of Universal module) — This proposal adds the Universal structure found in Poly/ML to the Basis Library.

SML/NJ Library

The SML/NJ Library is now mostly documented; see doc/html/smlnj-lib/index.html in the distribution or the online documentation.

The HTMLDev structure in the pretty-printing library ($/ has been renamed as HTML3Dev and moved into its own library ( The renaming is in anticipation of renaming the HTML Library to "HTML3" and the moving it to its own library removes a dependency from the compiler on $/

There were many small improvements (and a couple of bug fixes) to various parts of the SML/NJ Library; see the smlnj-lib/CHANGES file for details.


Changed the semantics of the --debug command-line option for ml-antlr. Previously this option replaced the actions with a print expression, but that limited its usefulness because of type errors in the generated code. The new behavior is to preserve the existing actions and just add the printing code.


This release contains a substantial amount of new documentation for the SML/NJ Library (see doc/html/smlnj-lib). While the documentation is not complete, it does cover the most commonly used components (with the exception of the pretty-printing library).


The default installation for machines that report “`x86_64`” as their hardware is now 64 bits. See the installation instructions for more details.

32-bit macOS issues

While the x86 installer for 110.98 works on macOs 10.14 Mojave, building from source requires some extra steps because the version of Xcode distributed for Mojave does not include a 32-bit SDK.

Another issue that you may encounter when building on macOs 10.14 Mojave is an error message for a shell script of the form

  /bin/sh: bad interpreter: Operation not permitted

This error arises because the attribute is set on the shell script. To fix the problem, remove the attribute using the command

  xattr -d shell-script

and resume the build.


Here is a list of tracked bugs fixed (or closed) with this release, please see the bug tracker for more details.


Cross compilation from amd64 to x86 does not work

256 incorrect


HASH_TABLE listItems error in reference manual


Perform divide on crashes with FPE on Linux


Weird "calc_strictness" message being printed


JSON parser fails on empty object


JSON parser ignores suffixes

Supported systems

We believe that SML/NJ will build and run on the following systems, but have only tested some of them:

Architecture Operating System Status


FreeBSD 12.0


macOS 10.14 (Mojave)


macOS 10.15 (Catalina)


macOS 11.0 (Big Sur)


Ubuntu 16.04.3 LTS


Ubuntu 18.04.3 LTS



Power PC

Mac OS X 10.5 (Leopard)







x86 (32-bit)

Mac OS X 10.6 (Snow Leopard)

Mac OS X 10.7 (Lion)

Mac OS X 10.8 (Mountain Lion)

Mac OS X 10.9 (Mavericks)

Mac OS X 10.10 (Yosemite)

Mac OS X 10.11 (El Capitan)

macOS 10.12 (Sierra)


macOS 10.13 (High Sierra)


macOS 10.14 (Mojave)


Ubuntu 16.04.3 LTS


Other Linux variants

FreeBSD 12.0


Other BSD variants

Windows 7

Windows 10

Cygwin (32-bit)