Getting Started with PolyML

PolyML でコンパイルする方法が結構ややこしいのでメモを残しておきます。 (いきなり複数ディレクトリが存在する複雑な例で説明しますが、現実的には 1 つのファイルしかプロジェクトに存在しないという状況はないと思いますので。)

PolyML にはパッケージ管理ツールなどという高級なものは存在しませんので、build.sml に依存関係を書きます。 なお、他にも poly コマンドで REPL を起動してごにょごにょする方法もありますが、メリットがないので忘れてよいと思います。

ここではプロジェクト内に lib/Maybe.sml, src/main.sml が存在するとします。 ファイルの内容はそれぞれ以下のような感じです。

signature MAYBE =
sig
  datatype 'a t = Nothing | Just of 'a
end

structure Maybe : MAYBE =
struct
  datatype 'a t = Nothing | Just of 'a
end
fun main () =
let
  open Maybe
  val j = Just 3
in
  case j
    of Just n  => print (Int.toString n)
     | Nothing => print "Nothing"
end

どうでもいいですが、PolyML ではどこかで fun main() が定義されていないとコンパイラに怒られます。

で、build.sml の内容は以下のようにします。

use "lib/Maybe.sml";
use "src/main.sml";

ここで注意すべき点は、build.sml の use に指定する path は polyc を実行する場所からの relative path ということです。 build.sml からの relative path ではありません。

さて、build.sml が作成できたら polyc でコンパイルします。 毎回指定するのは面倒なので Makefile を書きます。

.PHONY: all

all:
    mkdir -p build
    polyc -o build/main build.sml

clean:
    rm -fr build

できたら実行しましょう。

$ make
$ ./build/main
3

という感じです。

Comments

comments powered by Disqus