LunarML
LunarML copied to clipboard
The Standard ML compiler that produces Lua/JavaScript
LunarML
A Standard ML compiler that produces Lua/JavaScript.
Building
You need a recent version of MLton to build the executable, and Lua 5.3+ or recent Node.js to run the compiled script.
$ make
$ make test
$ make test-stackless-handle
$ make test-luajit
$ make test-nodejs
$ make test-nodejs-cps
$ ./lunarml example/hello.sml
$ lua example/hello.lua
Hello world!
Usage
./lunarml [options] input.(sml|mlb)
Modes of operation:
-
-mexe
(default): Produces Lua/JavaScript program. -
-mlib
: Produces a Lua module.
Targets:
- Lua
-
--lua
(default): Targets Lua 5.3+. -
--lua-stackless-handle
: Targets Lua 5.3+. Allow deeply nestedhandle
. -
--luajit
: Targets LuaJIT.
-
- JavaScript (ES2020+)
-
--js
: Produces a JavaScript program. -
--js-cps
: Produces a JavaScript program (CPS mode; supports delimited continuations).
-
See --help
for more information.
Features
- Most of SML '97 language, including signatures and functors
- A subset of SML Basis Library
- Interface to Lua
- Interface to JavaScript
- ML Basis system like MLton
Successor ML features:
- [x] Monomorphic non-exhaustive bindings
- [x] Simplified recursive value bindings
- SML '97-compatible ordering for type variables is also supported:
val <tyvarseq> rec <valbind>
- SML '97-compatible ordering for type variables is also supported:
- [x] Abstype as derived form
- [x] Fixed manifest type specifications
- [ ] Abolish sequenced type realizations
- [ ] Line comments
- [x] Extended literal syntax
- [x] Underscores (e.g.
3.1415_9265
,0xffff_ffff
) - [x] Binary notation (
0b
,0wb
) - [x] Eight hex digits in text (
\Uxxxxxxxx
)
- [x] Underscores (e.g.
- [ ] Record punning
- [x] Record extension
- [x] Record update
- [ ] Conjunctive patterns
- [ ] Disjunctive patterns
- [ ] Nested matches
- [ ] Pattern guards
- [ ] Optional bars and semicolons
- [ ] Optional else branch
- [ ] Do declarations
- [x] Withtype in signatures
Other extensions planned:
- [x] Vector expressions and patterns
- [ ] Packaged modules (like in Alice ML or HaMLet S)
- [x] Hexadecimal floating-point constants (e.g.
0x1p1024
,0x1.ffff_ffff_ffff_f
) - [x] Variably-encoded Unicode escape sequence in string literals (e.g.
\u{3042}
)
The syntax of hexadecimal floating-point constants is:
<hexadecimal-integer-constant> ::= '~'? '0' 'w'? 'x' <hexadecimal-digit-sequence>
<hexadecimal-floating-point-constant> ::= '~'? '0x' <hexadecimal-digit-sequence> (<binary-exponent-part> | '.' <hexadecimal-digit-sequence> <binary-exponent-part>?)
<hexadecimal-digit-sequence> ::= <hexadecimal-digit> ('_'* <hexadecimal-digit>)*
<binary-exponent-part> ::= [pP] '~'? <digit> ('_'* <digit>)?
In short: the (binary) exponent part is optional and use tilde (~
) for the negation symbol.
The \u{}
escape sequence allows you to embed a Unicode scalar value in a string literal.
The compiler encodes the character in UTF-(8|16|32), depending on the string type.