読者です 読者をやめる 読者になる 読者になる

type t (* void *)

関数型言語や英語学習の事とか。

smlnj: 実行形式の作成

SMLNJには実行形式の作成を想像しているものと同じかどうかわからないけども、サポートしている。
僕が忘れそうなのでメモしておく。

njにはnj独自のライブラリが沢山あるが、SMLofNJストラクチャは第一級継続や実行形式の生成をサポートするための機能を提供する。

The SMLofNJ structure

実行形式を作る方法は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