./index.html ../index.html

Concurrent Cleanに挑戦した…というか遊んでるだけだった時の記録

Haskellと一体何が違うのか、Concurrent Cleanです。

…いきなり、その程度の認識ですかい、みたいな書き出しで始めてしまいましたが、関数型言語にはC言語より高速なコードを吐くコンパイラはML系などけっこうあるようです。 で、Haskellは遅いです。 Concurrent Cleanは、Haskellに似た文法を持ちつつ、速いらしいという噂が。

ごめんなさい。その程度の認識です

インストールは、展開して実行するだけ。 初回起動時に何か訊いてくるのでとりあえずYes。

IDE

で…サンプルのWorm.prjを開いて実行してみると…。

サンプル動作画面

うぉお、フルスクリーンゲームだ。 何か知らんがHaskellより凄そうというのは伝わってきました。 音も鳴るんですよ、これ。 MIDIファイルが付いてます。 ステージ2以降があったりして、結構凝ってます。

さて…例によってドキュメントは難しい話ばっかで、優しいチュートリアルなんて存在しないので、どこか優しい入門ページを探すところから始めないと…。

日本語のページでは、色々検索しても<a href="http://sky.zero.ad.jp/~zaa54437/programming/clean/CleanBook/" target="_blank">Cleanで関数プログラミング</a>*1Halfway between Functional and Funkぐらいしか見つかりませんでした。 ざっと見た限り…引数の前に!を書くことで、部分的に正格評価*2ができる事ぐらいしかHaskellとの違いがわからず。 でも、それだけでも効率が良くなりそうなのは、なんとなく。

メモ

いまだに、標準入出力の使い方すらわからないのですが…。

環境渡し

Haskellはモナドで(ということにして)表現していた外部世界を、*Worldという明示的な値で引き継いでいきます。 型の前にアスタリスクを付けると、その値は一回しか使えない、という意味のようです。 Worldを変更する関数、つまり何らかの入出力を行う関数は、新しいWorldを返します。 その新しいWorldもやっぱり一回しか使えず、次に何かする関数はまた新しいWorldを返して…。 そうやってどんどんWorldを更新していき、最後に最新のWorldを全体の返値にする、と。

Hello World?

デフォルトで、Start関数の結果を表示してくれて、キー入力待ちまでしてくれます。 これやめさせるのどうすればいいんでしょうね?

module a
import StdEnv, StdFile
Start world 
  # (stdinout, world) = stdio world
  = fwrites "OK.\n" stdinout

*1 どうもVECTORは.ad.jpのリンクを勝手に削除するらしい。 まあ当然か。

*2 遅延評価の逆で、引数が関数が呼ばれるよりも前に評価されること。 要するに普通。