SML#1.0をコンパイル

Win7(32bit, cygwin)上へのインストール方法。
コンパイラは普通に動作します。インタプリタはすぐ落ちてしまいますが…。*1


<追記>

オゥ…。まぁパスの扱い以外はどっちでもいいし出来ればネイティブで動いてくれた方が気持ちよいので、大人しくmingw版使いましょうか…。

必要なもの

(私はmltonからbootstrapしました)

$ ./configure --program-suffix=cyg_mlton CPPFLAGS=-I/usr/local/include --with-stage0=mlton
$ make stage0
$ make
$ make install
    • program-suffix を指定したけど smlsharp.exe が出来ました。アリャ?

試用

(* test.smi *)
_require "basis.smi"


(* test.sml *)
_interface "test.smi"

structure Main =
struct
  (* 慣例に則って main *)
  fun main () =
    print "Hello, SML# !\n"
end

val _ = Main.main (); 

smiファイルは必須なのかな?メンドイぞ…。(自動生成はどうやるんだ

$ smlsharp.exe -o hw test.sml
$ ./hw
Hello, SML# !
$

動きました!!

多相レコード

SML# 特有の機能を使ってみます。

structure Main =
struct
  infixr 1 $
  fun f $ a = f a

  val fst = #1
  val snd = #2

  fun main () =
    (print "Hello, SML# !\n";
    print $ fst ("foo\n",123); (* 2タプルに適用 *)
    print $ snd (314, "bar\n", "bazz")) (* 3タプルに適用 *)
end

val _ = Main.main ();
(*
$ ./hw
Hello, SML# !
foo
bar
*)

おぉう!素晴らしい!


SMLにおいては タプルは数字で表されるフィールドを持つレコード なので、
任意数タプルの特定のN番目の要素にアクセスする関数が書けます。 上のプログラム中では #1 と #2 です。
ですのでこのコードは多相レコードという機能(?)が無いSMLでは実行できない事態になります。

*1:リンクするファイルが足りてない様子