プログラミング言語Cyan
- takuto_hの日記: Cyan, Yet Another New language (http://d.hatena.ne.jp/takuto_h/20081022/1224665176)
- プログラミング言語Cyan (http://www.geocities.jp/takt0_h/cyan/index.html)
Cyan(さいあん)は私の中でLisp + Pythonというイメージで機能的には面白そう。フィボナッチ数計算の再帰版とDP版を書いた。パフォーマンスはまだまだだが、かなり期待できる。
def(fib)^(n): if(n == 0 || n == 1): n else: fib(n-1) + fib(n-2) iota(36, 1).foreach^(i): print(i) print(" => ") say fib(i)
def(fib)^(n): $(n1, n2, tmp) = &(0, 1, 1) iota(n-1, 1).foreach^(i): $(tmp, n1, n2) = &(n1+n2, n2, n1+n2) tmp iota(36, 1).foreach^(i): print(i) print(" => ") say fib(i)
if elseでエラーが出ると思っていてググっていたらelseのインデントをifよりも下げないといけないらしい。なぜだろう?if elseが、if-letの意味であるから?
あと2chにも書いてあったけど、quicksortを書くのに結構冗長な書き方になってしまう。記述が冗長になってしまうのは全体的に感じたのでそこは残念。最近はショートコーディングが流行っているだけに、そこは痛いかも。Javaも冗長性の部分が嫌われていると思うし。構文が冗長になる理由は恐らく、多重代入の部分を見る限り、文脈でなく構文で意味を区別しているからでははないだろうか?
マクロとか継続とかLisp、Scheme系の機能は私は理解していないので、そういう部分を勉強できそうなのは良いかも。
要望としては、無限リストの扱いとそのイテレーション処理がまだできないと思うので、ぜひ簡潔な記述で実現できる機能を取り入れてほしい。Pythonは無限の扱いはイテレータしかないのでそういう部分の扱いが弱い(厳密に言えばxrangeなどイテレータのような動作をするイテレータでないクラスもある)。あとPythonは関数とクラスの呼び出し側の構文上の区別はなくジェネレータみたいなものもある。
あとporter、messenger、indexer、expanderをきちんと理解していないが、その辺はの仕組みは面白そう。Pythonはシーケンスプロトコルやイテレータプロトコルのところは成功している印象があるので、言語が規約を用意していて、その上にビルトインやライブラリなどが構成されているというのは良さそう。むしろプロトコルというより特殊メソッドに近いのだろうか?