Cyan, Yet Another New language

プログラミング言語Cyanを公開しました。

これは、私がU-20プログラミング・コンテストに応募し、個人部門で賞をいただいた作品です。

Cyanは「さいあん」と読みます。Lispのマクロを持ち、Python風のインデントによってブロックを表します。インスタンスベース・オブジェクト指向や継続といった概念を取り入れています。

以下に簡単な紹介を載せます。詳しい説明は、Cyanリファレンスマニュアルなどをご覧ください。

S式とマクロの分離

Cyanのもっとも大きな特徴は、LispのS式とマクロの分離を試みたことです。

mac(while)^(test, body):
  `loop:
    if(!?test): break()
    begin(?body)

これは、準クオートを用いて記述したwhileマクロです。単純なマクロはこのように簡単に記述できます。

これが可能なのは、式がすべてオブジェクトだからです。関数呼び出しも、演算子式も、すべてが操作可能なオブジェクトです。つまり、Cyanはコードとデータを区別なく扱えるのです。

もちろん、もっと複雑なマクロも記述できます。興味のある方は、http://www.geocities.jp/takt0_h/cyan/doc/ref/using-macro.htmlをご覧ください。

インデント・ブロック

上の例でも用いましたが、Cyanはインデントによってブロックを表します。

i = 0
while(i < 10):
  say(i)
  i++

先ほどのwhileマクロはこのように呼び出します。

また、if関数の呼び出しは特徴的です。

if(x == 0):
 say("then_body")
 say("x == 0")
 else:
  say("else_body")
  say("x != 0")

elseというシンボルを使って、2つ目のブロックを渡しています。このようにして渡されたブロックは、キーワード引数として受け取れます。

インスタンスベース・オブジェクト指向

Cyanはインスタンスベース・オブジェクト指向によってプログラムを記述できます。スロット、メッセージ、ペアレントへの委譲という三つの概念によって構成され、動的にメソッドの追加・変更が可能です。

詳しくは、http://www.geocities.jp/takt0_h/cyan/doc/ref/instance-based.htmlをご覧ください。

継続

Cyanには、Schemeなどの言語で見られる継続が実装されています。loopマクロの中で使えるbreakやcontinue、関数から戻るためのreturnも継続が代入された変数です。次のようにして使われています。

mac(loop)^(body):
  `begin:
    continue := []
    callcc^(cont): continue = cont
    callcc^(break):
      begin(?body)
      continue()

Cyanの処理系は、継続の仕組みをなるべく単純にするため、少し変わった実装をしています。興味のある方は、ぜひご覧ください。

最後に

現在のCyanには、ファイル出入力などの実用的な機能はほとんど実装されていません。ですから、おもちゃのような言語だと思って遊んでいただけるとうれしいです。