プログラミング言語「Pure」をインストール

最近知ったプログラミング言語「Pure」をインストールしてみます。
http://d.hatena.ne.jp/Dubhead/20100312/p1 ここも参考にして書きました。
Ubuntu 9.10でやっています。

Pureについて

動的型付けの言語らしいです。インタプリタコンパイラ、どっちも使えるようです。
自分でもまだよくわかっていません。今度調べようと思っているので、とりあえず公式サイトを書いておきます。
Pureの公式サイトは http://code.google.com/p/pure-lang/ ここにあります。

まずは、必要なパッケージをインストール

sudo aptitude install build-essential flex bison libgmp3-dev libreadline-dev

このコマンドで、LLVM以外の必要なソフトはインストールできますが、LLVMだけは自力でビルドします。

LLVM」のビルド

LLVMとは、コンパイラを作るために使うソフトで、コード生成や最適化をするものらしいです。
Pureは、コンパイルLLVMを使っているので、インストールしておきます。
注意: LLVMはとても大きなソフトです。ビルドには、長い時間と、たくさんのディスク容量を使います。
8MBのtgzファイルが、解凍してビルドし終わった時には、中間ファイルも含めると100MB以上にも膨れ上がります。
今回は、現在(この記事を書いた時)の最新版である、バージョン2.7をインストールします。

まず、LLVMのソースのアーカイブをダウンロードします。
今回は、面倒なので

wget http://llvm.org/releases/2.7/llvm-2.7.tgz

このようにしました。
次に、ダウンロードしたファイルを解凍してビルドします。
さっきも書きましたが、長い時間と、100MB以上のディスク容量を必要とします。(150MBぐらい使った気がする)

tar zxvf llvm-2.7.tgz
cd llvm-2.7/
./configure --enable-optimized --disable-assertions --disable-expensive-checks --enable-targets=host-only
make
sudo make install

このようにしてビルド、インストールします。

終わったら、一旦端末を閉じてもう一度起動しておきます。

Pureのインストール

Pure言語の本体のインストールです。
現在(この記事を書いた時)の最新版、バージョン0.43をインストールします。

まずは、ソースのtar.gzファイルをダウンロードします。
面倒なので、これも

wget http://pure-lang.googlecode.com/files/pure-0.43.tar.gz

としてダウンロードしました。

次に、ビルドしてインストールします。

tar zxvf pure-0.43.tar.gz
cd pure-0.43/
./configure
make
make check
sudo make install
sudo /sbin/ldconfig

としてビルド、インストールします。
「make check」のところは、正しく動作するかテストしています。
「sudo /sbin/ldconfig」で、共有ライブラリを使えるようにします。これをしておかないと、起動する時にエラーが出てしまいます。

使ってみる

端末を起動して、

pure

というコマンドを実行して、インタプリタの対話モードを起動します。

Pure 0.43 (i686-pc-linux-gnu) Copyright (c) 2008-2010 by Albert Graef
This program is free software, and you are welcome to redistribute it under
certain conditions. There is ABSOLUTELY NO WARRANTY. (Type 'help copying'
for more information.)
Loaded prelude from /usr/local/lib/pure/prelude.pure.

> 

と表示されます。

1 + 1;

と入力すると、
「2」と、結果が返ります。
変数の定義は、

let foo = 2;

のようにします。
関数定義は、

a x = x + 10;

のようにします。

a 20;

とすると、「30」と、結果が返ります。
パターンマッチも使えます。

fact 0 = 1;
fact n = n * fact (n - 1);

のようにします。

fact 10;

とすると、「3628800」という結果が返ります。
ここまでは、普通の言語のような感じでした。
しかし、Pureには、他の言語にはない特徴的な機能があります。

foo + bar;

を実行します。「foo」は、「2」と定義されていますが、「bar」は未定義です。
普通の言語なら、「変数が未定義です」とエラーが出ますが、Pureではどうなるでしょうか。
Pureでは、「2+bar」と表示されます。「foo」が「2」に置き換えられた式が返ってきます。
「答えがわかる所は置き換えて、わからない時はそのままにする」という仕組みがあるようです。
...書き忘れていました。Hello Worldはこうします。
まず、

using system;

で、systemモジュールを読み込みます。文字列を出力puts関数など、いろいろな関数が使えるようになります。
そして、

puts "Hello World!";

で、表示できます。
「13」という結果が返りますが、これは文字数のようです。

quit

と入力すると、インタプリタを終了できます。
Pureのプログラムをコンパイルして実行ファイルを作ることもできます。

using system;

puts "Hello World!";

というプログラムを、「helloworld.pure」という名前で保存して、

pure -c helloworld.pure -o helloworld

としてコンパイルすると、「helloworld」という実行ファイルができます。

./helloworld

として実行すると、「Hello World!」と出力されます。
ちなみに、コンパイルにはg++が必要です。

この言語については、これからももっと調べていこうと思います。