Mozart2 - Oz言語 を利用する (OSX,非emacs,CUI)


## 動機

僕は emacs が使えないので、普段の環境で「<a href="http://www.amazon.co.jp/gp/product/4798113468/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4798113468&linkCode=as2&tag=cafeblackmill-22">コンピュータプログラミングの概念・技法・モデル</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=cafeblackmill-22&l=as2&o=9&a=4798113468" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />」（通称ガウディ本）の例題を実行できるようにしたい。この例題がちゃんと解けないと会社で居場所がなくなってしまう。恐怖と戦いながらこれを書いている。

普段の環境とは、Mac OSX と bash と vi だ。

## Mozart2 のインストール

こちらを参考に実施した。

http://qiita.com/thermes/items/c7461e789e0b2fe2df43


## パスの特定

上の手順通りやっていれば、ozcは以下の場所にいる。

```
/Applications/Mozart2.app/Contents/Resources/bin/ozc
```

これから毎日使うので、パスを通しておく。

```
echo 'export PATH=$PATH:/Applications/Mozart2.app/Contents/Resources/bin' >> ~/.bash_profile
```

## 実行

とりあえず、以下のようなファイルは実行できる。

```
functor _
require
   System
prepare
    % システムの関数を使い、文字列を表示するプロシージャ
    proc {Show T}
       {System.showInfo {GetMsg T}}
    end

    % 文字列を返す関数
    fun {GetMsg N}
       % 文字列連結は "#"
       'Hello ' # N # '!!'
    end

    {Show 'Oz'}
end
```

実行する。

```
# -e でコンパイルして実行する（デフォルト）
$ ozc -e test.oz

Hello Oz!!
```

動いた。

## 階乗を求める

「階乗はHello World」とは上司の言である。

```
$ cat fact.oz
functor _
require
  System
prepare
  fun { Fact N }
    if N == 0 then 1
    else
      N * {Fact N -1 }
    end
  end
  { System.showInfo {Fact 10} }
end

$ ozc fact.oz
3628800
```

## ozc の help

`--help` で見れる。 `-e`が Compile and execute である。

```
$ ozc --help
Usage: x-oz://system/Compile.ozf { [option] | [file] }
You have to choose one of the following modes of operation:
-h, -?, --help                Output usage information and exit.
-e, --execute, --mode=execute Compile and execute a statement.
                              This is the default mode.
-c, --dump, --mode=dump       Compile and evaluate an expression,
                              pickling the result
                              (file extension: .ozf).
-x, --executable, --mode=executable
                              Compile and evaluate an expression,
                              making result executable
                              (file extension: none).
-E, --core, --mode=core       Compile a statement to core language
                              (file extension: .ozi).
-S, --scode, --mode=scode     Compile a statement to assembly code
                              (file extension: .ozm).
-s, --ecode, --mode=ecode     Compile an expression to assembly code
                              (file extension: .ozm).

.. 略 ..

```

## 続く

日本語の wikipedia は寂しいもんだけど、英語 wikipedia はかなり充実してる。

http://en.wikipedia.org/wiki/Oz_(programming_language)

公式プロジェクトのwikiにも軽く目は通しておきたい。後で。。
https://github.com/mozart/mozart2/wiki


ozc については本にはほとんど触れられていない（付録の「コマンドラインインターフェイス」に半ページほど記載がある）。なかなか動作させることができず、ファイルを実行するトリックについては、以下のやりとりを参考にした。

https://github.com/mozart/mozart2/issues/37


`System.showInfo`だと、本で使われている Browse とか Show のような、inspect 的な出力が出来ない。リストの中身の出力とか、いろいろ足りない部分がある。こっから先は標準ライブラリの中身とか調べていくしかなさそうだ。

というか、そもそも、<a href="http://www.amazon.co.jp/gp/product/4798113468/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4798113468&linkCode=as2&tag=cafeblackmill-22">コンピュータプログラミングの概念・技法・モデル</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=cafeblackmill-22&l=as2&o=9&a=4798113468" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />の内容は 「Mozart1.3に近い」と明記されているわけであるから、そっちを使うべきなんじゃないかと思ってきた。

考えるべきではないことを考えそうになったので、ここで一旦終わることにする。>>[続きがこちら](http://qiita.com/ma2saka/items/0020941c2baa4a6bf501)