MiniML言語の使い方
MiniML は MiniC とほぼ同様の方法で起動,呼び出し,終了できる.
1. 処理系の起動方法
====================
自分のホームディレクトリの下に,「本演習用の作業ディレクトリ」を決め
て,そこに,いくつかのファイルをコピーする.(ここでは作業ディレクトリ
を ~/ML とする.)
cd ~
mkdir ML
cd ML
cp ~kam/miniml/main.cmi . (システム実行の際に必要)
cp ~kam/miniml/*.ml . (*.ml はMiniML言語のテストファイル)
システム起動方法:
~kam/miniml/miniml
もし,事前に,
cd ~/ML
ln -s ~kam/miniml/miniml (MiniML処理系へのリンク)
としておけば,
./miniml
とするだけよい.
上記で起動できない場合,ls -l ~kam/miniml/minimlとやって,
自分の権限で,ファイルが読めるかどうかチェックする.また,
ocaml コマンドがない場合も起動できないので,
ocaml というコマンドをたたいてみる.(ocamlから抜ける時は,
control-d を押す.)
2. MiniMLプログラム実行方法
===========================
Main.run "ex1.ml" ;;
上記のように実行したときに,
Error: Unbound value Main.run
というメッセージが出たら,「1」の作業で main.cmi をコピーし忘れ
たと思われる(あるいは,コピーした作業ディレクトリとは違う場所に
移動して MiniML を起動したものと思われる).上記の作業を確認してほ
しい.
正しく設定されているとき,上記のように ex1.ml を実行すれば,
以下の出力が得られるはずである.
miniML interpreter Version 4.2:
3
5
...
36
- : string = "ok"
#
最後の行 (...string ...という行)は,無視してほしい,その前の行
が実行結果であり,この場合,3 から 36 である.
上記を実行したあとに,続けて別のファイルを実行できる.
Main.run "ex2.ml" ;;
3. 処理系の終了方法
====================
C-d (control-d)を押せば,MiniML 処理系(だけでなく,その
ベースとなっているOCaml処理系) から抜けることができる.
なお,C-z (control-z)で中断したままでは,メモリをたくさん消費する
ので,なるべくきちんと抜けること.
さらに,無限ループとなるプログラムを実行してしまった
ときは C-c (control-c) を押せば,計算を途中でやめて
MiniML処理系のレベルにもどることができる.
4. MiniML プログラム例題
========================
~kam/miniml/ex*.ml (* は 1,2,3,...) というファイルが,
例題ファイルである.
これらのファイルに含まれるプログラムの一部は,処理モード
によっては停止しないので注意されたい.(C-c を押す必要が
ある.)
5. 処理系の「モード」を変更したいとき
======================================
Main.mode n ;;
とやるとよい(ただし,n は 0,1,2... である.n の最大値がいくつ
であるかは,その時点での処理系の作りによる.)
「処理系のモードが 0とか 1というのは何を意味するのか?」という
疑問が当然置きるであろう.実は,「それを考えよ」というのが課題
であるので,ここでは説明しない.
6. MiniML 言語の構文
====================
講義時に配布した資料を参照してほしい.なお,授業のweb page からも
取得可能である.ex2.ml という例題ファイルも見てほしい.
7. MiniC のエラーメッセージ
============================
現状の処理系は,最小限のエラーしか出さない.また,全てのエラー
に対応していない可能性もある.もし,OCaml のプログラムを理解し
てプログラムしたい人がいたら,ソースコードを見せるので,改良して
ほしい.
8. MiniML の show 関数, print 関数
==================================
show 0 を実行すると MiniC と同様,その時点でのスタックの中身を簡単に表
示する(ただし,MiniML処理系では,簡潔な表示とするために, Access Link
でつながっているスタックフレームのみを表示している.MiniC では,スタッ
クフレームをすべて表示していたことに注意されたい.)
show 1 を実行すると,その時点でのヒープの中身を簡単に表示する.
ヒープの構成要素は,#3 や #5 といった名前をもつセル(2個のメモリをもつ)
とする.すなわち,ヒープは単なる(番地つき)巨大メモリではなく,セルがた
くさん集まっているものと考える.1つ1つのセルの名前は,#1 や #2 である.
show 1 によって,#1=(100,#23) と表示されたとき, #1という名前のセルの
中身が,100 と #23 の2つであることを意味し,100は整数の100であり,#23
は別のセルへのポインタである.
このあたりは,言葉による説明より,実際の中身を見た方がよいと思われるの
で,ex2.ml などのファイルを実行して,ヒープの中身を見てほしい.
print e とやると,e の計算結果を印刷する.e が関数のときに何が印刷され
るかは,自分で試してほしい.なお,print e という式そのものも,計算し
た後には何か値を返さないといけないのであるが(C言語では print は「文」
であるが,ML言語では「式」である),意味のある値を返すわけにもいかない
ので,常に () という値を返す.() というのは不思議な値であるが,まあ,
そういう習慣だ,と理解してほしい.したがって,(print 1, print 2) と
やると, 1, 2 が順番に印刷されたあと,((), ()) という不思議な値が
返ってくる.
9. 自分で MiniMLプログラムを書くときの注意
======================================
ex1.ml 等のファイルを自分で作るときは,必ず,
式 ;; 式 ;;
式 ;; 式 ;; 式 ;;
式 ;;
というように,式を1つ書いて,semicolon 2つで区切る,という
ように書くこと.semicolon 2つが連続してなかったり,式でないも
のを書くと,parser がエラーをだしてしまい,式が1つも評価されない.
OCaml では、式を semicolon 2つで区切るのではなく、
let x = 1 + 2
let y = 1 + 2
のような書き方が許されているが、MiniML ではこの書き方は許して
いない。