Pure言語についてのメモなど

Pureの、機能や構文などについて、わかったことを書いておきます。
Pureマニュアル日本語版(http://d.hatena.ne.jp/cu39/20100609/1276102382)などを参考にしました。
この記事は未完成です。ずっと完成しないかもしれません。これからさらに追加される可能性があります。

定数シンボル(nonfix)

nonfix」という機能を使えば、「名前ではなく、値として扱われるシンボル」を定義できます。

nonfix foo;

これは、「foo」という定数シンボルを定義します。
「foo」は、何か別の値に結びつけられているのではなく、そのまま「foo」という値を表します。

hoge foo = 10;

普通の場合は、

hoge 10;

とした場合、パターンマッチに成功して「10」が返りますが、
fooがnonfixとして定義されている場合は、マッチは失敗します。

リスト内包

HaskellPythonなどのようなリスト内包を使うことができます。

a = [x | x = 1..20; x mod 2];

変数aに、1から20までの間の奇数のリストが入ります。
「x = 1..20」の部分で、1から20までの数の並びを生成し、「x mod 2」で、2で割り切れないものだけを選んでいます。

アウトフィックス演算子

Pureでは、「outfix」という機能を使うことで、「値を囲む」という形の演算子を定義することができます。
「@{」と「}@」で数字を囲むと、数字が2倍になるように定義するにはこうします。

outfix @{ }@;
@{x}@ = x * 2;

「outfix @{ }@;」で、「@{」と「}@」をアウトフィックス演算子として宣言して、
「@{x}@ = x * 2;」で、演算子の処理内容を定義します。

@{10}@;

こうすると、「20」が返ります。

C言語の関数を呼び出す

Pureでは、共有ライブラリを使うことで、C言語の関数を簡単に呼び出すことができます。
まずは、呼び出されるC言語の関数が入っている共有ライブラリを作ります。

int func(int x) {
  return x * x;
}

これを「hoge.c」という名前で保存しておきます。
そして、

gcc -shared -fPIC -o hoge.so hoge.c

コンパイルして、共有ライブラリ「hoge.so」を作成します。
これをPureから呼び出してみます。

using "lib:hoge";
extern int func(int);

として、関数「func」をPureから使えるようにします。
「using "lib:ライブラリ名"」として、共有ライブラリを読み込みます。ライブラリ名は、共有ライブラリのファイル名から拡張子(.so」を取ったものです。
「extern 戻り値の型 関数名(引数の型)」で、関数をPureから使えるようにします。
これを使ってみます。

func 5;

とすると、「5」が返ります。PureからC言語の関数を呼び出せました。

式リファレンス

この機能を使うと、書き換えられる変数を作れます。関数型言語なので使わないほうがいいとは思いますが。

let a = ref 10;

として、aを書き換えられる変数として定義します。今は「10」という値になっています。
しかし、aをそのまま評価しても、「10」になるわけではありません。
書き換えられる変数の中身を取得するには、「get」という関数を使います。

get a;

こうすると、「10」という値を取得できます。
中身の値を変えたい時は、「put」という関数を使います。

put a 20;

こうすると、中身の値を「20」に変えることができます。

get a;

とすると「20」が返ります。
「let a = ref 10;」のところを「a = ref 10;」としてしまうと、put関数を使っても書き換えられないので注意が必要です。

ローカル変数(when)

「when」という構文を使って、ローカル変数を定義することができます。

式 when
  定義;
  定義;
end;

このように使います。定義はいくらでも並べられます。定義は、上から順番に実行されます。
全ての定義を実行してから式を実行した結果が返ります。
例えば、

result when
  a = 10;
  b = 20;
  result = a + b;
end;

こうすると、「30」が返ります。