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として定義されている場合は、マッチは失敗します。
リスト内包
HaskellやPythonなどのようなリスト内包を使うことができます。
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」が返ります。