Getting Started with PolyML
Sat, Apr 7, 2018PolyML でコンパイルする方法が結構ややこしいのでメモを残しておきます。 (いきなり複数ディレクトリが存在する複雑な例で説明しますが、現実的には 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
という感じです。