サンプルについて

ここでは、サンプルフォルダに含まれるコードについて説明します。 サンプルコードは、

 
$ cyan sample/[ファイル名]
のようにして実行できます。

また、Cyan の基本的な機能を使用したテストコードが bin フォルダにあるので、 参考にしてください。

 
$ cyan test.cy
で実行できます。

bank-account.cy

このコードは、「 Wiki っぽい場(あるいは 疑似脳内ネットワーク)」にある、 BankAccount という問題を Cyan で解いたものです。 BankAccount はオブジェクト指向言語における力試し的なコードで、 オブジェクト指向に必要とされる要素が詰め込まれています。

Cyan の場合、ゲッターとセッターが存在しないために支障が出ています。 BankAccount のスロット dollars には値がそのまま入っていますが、 StockAccount の場合 dollars はメソッドでなくてはならず、 その2つの呼び出し方が異なる Cyan では、 StockAccount に BankAccount のメソッドが使えません。 この問題の解決策として、bank-account2.cy があります。

bank-account2.cy

bank-account.cy における問題の解決策です。 ゲッターとセッターに Indexer を用いることで、 StockAccount に BankAccount のメソッドが使えるようになっています。

coroutine.cy

coroutine とは、caller と callee の関係が存在せず、 実行を途中で中断・再開ができるルーチンです。

実装には変数 return が使用されており、継続の呼び出しが行われています。 Cyan のクラスは擬似クラスなので少し冗長な部分がありますが、 継続の使用例として特徴のあるコードです。

semi-coroutine.cy

semi-coroutine には caller と callee の関係が存在しますが、 coroutine と同様に実行の中断と再開ができます。

これらのコードは、「 callcc と coroutine と semi-coroutine」にある、 Ruby で書かれた coroutine と semi-coroutine をもとにしました。

fizzbuzz.cy

semi-coroutine の使用例です。1 から 100 までの数字を出力しますが、 3 の倍数の時は Fizz, 5 の倍数の時は Buzz, 15 の倍数の時は FizzBuzz と代わりに出力します。この例では、剰余を用いずに、 SemiCoroutine の実行を繰り返すことで実現しています。

title.cy

coroutine の使用例です。一見何を出力するか分かりませんが、 実行してみれば分かります。

hanoi.cy

ハノイの塔のプログラムです。特筆すべきことはありません。

lexer.cy

Cyan のスキャナを Cyan で実装しました。 インデントブロックについては、パーザでの操作が必要なのでうまく解析できませんが、 それ以外のトークンはすべて認識できます。標準入力から読み取るので、 リダイレクトを使ってファイルを指定してください。

qsort.cy

クイックソートのシンプルな実装です。

qsort2.cy

クイックソートの実装です。こちらは、リストを走査する回数が抑えられています。

qsort3.cy

qsort2.cy のブロックをすべてブレース形式に書き直したものです。