ここでは、サンプルフォルダに含まれるコードについて説明します。 サンプルコードは、
$ cyan sample/[ファイル名] |
また、Cyan の基本的な機能を使用したテストコードが bin フォルダにあるので、 参考にしてください。
$ cyan test.cy |
このコードは、「 Wiki っぽい場(あるいは 疑似脳内ネットワーク)」にある、 BankAccount という問題を Cyan で解いたものです。 BankAccount はオブジェクト指向言語における力試し的なコードで、 オブジェクト指向に必要とされる要素が詰め込まれています。
Cyan の場合、ゲッターとセッターが存在しないために支障が出ています。 BankAccount のスロット dollars には値がそのまま入っていますが、 StockAccount の場合 dollars はメソッドでなくてはならず、 その2つの呼び出し方が異なる Cyan では、 StockAccount に BankAccount のメソッドが使えません。 この問題の解決策として、bank-account2.cy があります。
bank-account.cy における問題の解決策です。 ゲッターとセッターに Indexer を用いることで、 StockAccount に BankAccount のメソッドが使えるようになっています。
coroutine とは、caller と callee の関係が存在せず、 実行を途中で中断・再開ができるルーチンです。
実装には変数 return が使用されており、継続の呼び出しが行われています。 Cyan のクラスは擬似クラスなので少し冗長な部分がありますが、 継続の使用例として特徴のあるコードです。
semi-coroutine には caller と callee の関係が存在しますが、 coroutine と同様に実行の中断と再開ができます。
これらのコードは、「 callcc と coroutine と semi-coroutine」にある、 Ruby で書かれた coroutine と semi-coroutine をもとにしました。
semi-coroutine の使用例です。1 から 100 までの数字を出力しますが、 3 の倍数の時は Fizz, 5 の倍数の時は Buzz, 15 の倍数の時は FizzBuzz と代わりに出力します。この例では、剰余を用いずに、 SemiCoroutine の実行を繰り返すことで実現しています。
coroutine の使用例です。一見何を出力するか分かりませんが、 実行してみれば分かります。
ハノイの塔のプログラムです。特筆すべきことはありません。
Cyan のスキャナを Cyan で実装しました。 インデントブロックについては、パーザでの操作が必要なのでうまく解析できませんが、 それ以外のトークンはすべて認識できます。標準入力から読み取るので、 リダイレクトを使ってファイルを指定してください。
クイックソートのシンプルな実装です。
クイックソートの実装です。こちらは、リストを走査する回数が抑えられています。
qsort2.cy のブロックをすべてブレース形式に書き直したものです。