The Standard ML of New Jersey (SML/NJ) system implements a number of extensions to the language as defined by the Definition.
Module language extensions
Higher-order functors
Structure constraints for signatures
structure ASTRUCT :> ASIG where B = BSTRUCT
Core language extensions
Vector expressions and patterns
SML/NJ extends the expression and pattern matching syntax to include support for vectors of some known size. The syntax is similar to that of list patterns, except that the opening bracket has a preceeding # character. For example,
fun scaleV (s : real, #[x, y, z]) = #[s*x, s*y, s*z]
This extension is always enabled in SML/NJ.
Or patterns
TO BE WRITTEN
Lazy datatypes and functions
SML/NJ provides support for lazy data structures with an extension to the datatype and function declaration forms (val rec). There are a number of ways to enable this feature, depending on the ??
-
From the command-line, you can use the -Clazysml=true flag when launching SML/NJ.
-
From the REPL, you can enable the feature using the SML command:
Control.lazysml := true;
-
In a CM, file you can specify that a source file uses the lazy keyword in a number of different ways. The following three lines all have the effect of enabling the lazy keyword during compilation of the file.
foo.sml : lazysml
foo.sml : sml (lazy)
foo.sml (with:parser.lazy-keyword=true)
TO BE WRITTEN
datatype lazy 'a stream = Nil | Cons of 'a * 'a stream;
fun lazy map f Nil = Nil
| map f (Cons(x,xs)) = Cons(f x, map f xs);
Quotation/antiquotation
TO BE WRITTEN
Successor ML extensions
Successor ML (sML) is an effort to continue to grow and improve the SML language. Andreas Rossberg has defined and implemented an some of the proposed features in a version of HaMLet. We are beginning to implement these features in SML/NJ in coordination with the MLton implementation.
Lexical extensions
As of version 110.79, SML/NJ supports the sML lexical extensions. These can be enabled using the command-line option -Cparser.succ-ml=true or the assignment
Control.succML := true;
in the REPL.
Numeric literals (SML/NJ 110.79)
The syntax of numeric literals is extended in two ways. First, the underscore character ("_") is now allowed as a separator between digits in a numeric literal. For example,
123_456
0wxff_ff_ff_f3
123_456.1
are valid numeric literals under this extension, but the following are not:
123._456 (* underscore not proceeded by digit *)
0wx_ff_ff_ff_f3 (* leading underscore *)
The second extension is binary literals for both integers and words. Similar to hexidecimal literals, the syntax uses a leading "0b" to signal a binary literal. Examples include
0b0101_1110 (* the same value as 0x56 or 86 *)
0wb1101 (* the same value as 0wD or 13 *)
Line comments (SML/NJ 110.79)
This extension adds line comments (i.e., comments that are terminated by the end of the line) to SML. These comments are denoted using the character sequence "(*)". Line comments properly nest into conventional block comments. For example, the following block comment is well formed:
(*
fun f x = x (*) my identity function *)
*)