SMLNJには実行形式の作成を想像しているものと同じかどうかわからないけども、サポートしている。
僕が忘れそうなのでメモしておく。
njにはnj独自のライブラリが沢山あるが、SMLofNJストラクチャは第一級継続や実行形式の生成をサポートするための機能を提供する。
実行形式を作る方法は2つ。現在の対話環境をそのまま保存するためのexportML
、関数1つをコマンドライン引数を渡して実行するexportFn
である。
val exportML : string -> bool
val exportFn : (string * ((string * string list) -> OS.Process.status)) -> unit
ためしにSMLofNJ.exportFn
をつかって外部コマンドをつくってみる。
下のようなプログラムを用意してみる。
fun test (cmd, arg) = (List.app print arg; OS.Process.success)
これをエキスポートするには、
SMLofNJ.exportFn ("name", test)
とすると、私の環境ではname.x86-linux
という、環境の名前がついたファイルが作られる。
これを実行するにはsml @SMLload=name.x86-linux
とすればよい。
実行形式と言ってもsmlnjが必要のようである。。。これは残念。
なおSMLofNJ.exportML
は本当にそのまま対話環境の状態を外に保存する。
[~/] sml
Standard ML of New Jersey v110.77 [built: Wed May 27 22:37:34 2015]
- val r = ref 10;
val r = ref 10 : int ref
- fun f x = x + 1;
val f = fn : int -> int
- SMLofNJ.exportML "some";
[autoloading]
[library $SMLNJ-BASIS/basis.cm is stable]
[autoloading done]
val it = false : bool
[~/] sml @SMLload=some.x86-linux
val it = true : bool
- r;
val it = ref 10 : int ref
- f;
val it = fn : int -> int