Concurrent Clean

http://www.cs.ru.nl/~clean/
非正格純粋関数型言語 Concurrent Cleanをいじり中。
このダイアリは普段から「読んでもわかんない」と言われてしまうのだが、今回は「純粋関数型言語」とか「haskell」とか「遅延評価」とか「忌むべき副作用」とかのキーワードに反応できない人はおいてけぼりにします。説明する努力も放棄。こんなん僕には説明できん。

以下、キーワードに反応した人向けに、概要とインストールの手順とIDEの簡単な使い方とファイル入出力サンプルコードをメモ。

概要

Concurrent Cleanは遅延評価と型推論を備えたhaskellと同系統の関数型言語で、参照透明性を保ちながら副作用のある処理を記述できる。haskellではそのためにモナドを利用しているが、Concurrent Cleanでは、一意型と呼ばれる型システムを利用する。今の僕の理解では、一意型は「ある変数の参照が一箇所しかない」ことを保証する型*1。参照透明性を保つというより、変更の可能性のある変数への参照を制限する、というほうが正確か。
また、関数型言語にはめずらしく言語標準のGUIライブラリもあり、サンプルにグラフィカルなゲームまでついてくる。IDEも標準装備。でも、RADツールは無い。残念。
コードはネイティブコードにコンパイルしてから実行されるので、かなりよい実行速度を叩きだす。でもインタプリタがない。ちょっと残念。IDE上でぽちぽちやれるからそんなに苦でもないけど。
処理系はWindowsLinuxSolarisMac用のバイナリが用意されている。GUI付きで各環境のネイティブコードが吐けるし、"Concurrent"っていうだけあって、これからのマルチコア時代にマッチした言語なんじゃないかと思うんだけど、日本語のドキュメントがほっとんどない。本家のチュートリアルも古いバージョンにしか対応してないみたい。あと、ざっと探した限り、ライブラリのリファレンスが発見できなかった。ソース読めってことか…

インストール

ダウンロードは http://www.cs.ru.nl/~clean/Download/main/main.htm から。Windowsバイナリのインストールは適当な場所にZipを展開して終わり。

IDEの使い方

池田さんのサイト(http://sky.zero.ad.jp/~zaa54437/programming/clean/)とか、http://nishis-web.hp.infoseek.co.jp/learning/fpl/HelloWorld.html とかに詳しい。
1ファイル1モジュール。ファイル名=モジュール名。複数のモジュールをまとめる"プロジェクト"という概念がある。ひとつのプロジェクトが一つの実行ファイルにコンパイルされる。だからモジュールだけではコンパイルできない。実行ファイルを作りたければ、プロジェクトは必須。
空のプロジェクトが作成できないことに気がつかないで少しはまった。少なくとも一つはモジュールを作成しておかないと、プロジェクトも作成できない。注意。

サンプルコード

ファイル入出力がらみのコードを書いてみた。以下のソースをfileio.iclという名前にしておくと、自分自身のソースファイルを一行ずつ読みこんで、一行ずつ表示する。副作用の塊であるファイル入出力は純粋関数型言語だと鬼門なのでけっこう苦労した。こんな感じでいいのかな?ファイルの終端を空文字列で判定しているのが不安。EOFかどうかを判定する関数がありそう。sfendというファイル終端を判定する関数を見つけたので修正。

module fileio
import StdFile,StdList,StdString

Start world = file_echo "fileio.icl" world

file_echo filename world = foldl f stdout (file2list file)
where
   f stdout string = fwrites string stdout
   (stdout,_) = stdio world_
   (_,file,world_) = (fopen filename FReadText world)

file2list :: *File -> [String]
file2list file = if (sfend file_) [] ([string]++(file2list file_))
where (string,file_) = freadline file

関連

日本語の情報としては、チュートリアルの和訳や言語リファレンスの和訳がある池田さんのサイト(http://sky.zero.ad.jp/~zaa54437/programming/clean/)が充実している。でも、硬い文章ばっかりなので、素人的にはキツイ。
簡単なチュートリアルとか、簡単なライブラリの解説とかどこかにないかなあ。

*1:線形論理に近い概念か?