yojikのlog

yojikのブログです

オブジェクト指向言語Nice

http://shootout.alioth.debian.org/gp4/nice.php
こちらを見ていていっつもJavaと同レベルの性能出していて気になってた不思議な言語Niceの紹介です。
これを一言でいうと、「こうあって欲しかったJava
静的型な言語にある長所を伸ばしながら、スクリプト言語っぽい簡潔な記述ができる。Javaもこんな感じだったらみんなにバカにされないぜ!!
以下のように色々盛りだくさんの機能もっている。

  • JVM上で動いて(というか.classファイルにコンパイルする)
  • Javaよりも簡潔にかけるような工夫があり
  • パラメタライズドクラスが使えて*1
  • クロージャとかは当然そなえつつ
  • MultiMethodをもつ
    • Dylan風味のマルチディスパッチができたり
    • 関数型言語とかにありそうなパターンマッチングによるディスパッチ
    • 普通にJava風味のメソッドも定義可能。
  • あとDBCの機能も付けといておいたから

という感じです。
MultiMethodは強力で、例えば以下のような実装ができる。これはfinalなclassにメソッドを後付する例でもある。

package sample;
/*Stringクラスをレシーバとするメソッドを定義する */
void hello(String name) {
  println("Hello!! " name);
}
void main(String[] args) {
  "Yojik".hello(); //Hello!! Yojik
}

多分Visitorパターンとかがクールに実装できる。
コンパイル時にメソッドの引数の型を判別して色々やっているのだろうけど、引数の型を定義したりコンパイルするというコストを払うかわりに、それなりの利益が得られるのはいいことだと思う。ただPython的というか、メソッド定義と呼び出しの引数の数がずれるのでキライな人もいるかも。

value dispathという、メソッドに渡された引数の値によってディスパッチメソッドを判定する方法もある。関数型言語にありそうな機能かな。

int plus(int i1 , int i2) {
  return i1 + i2;
}
/* レシーバが4の時のみこのメソッドが呼び出される*/
plus(4 , int i2) {
  throw new RuntimeException("4は不吉なのでエラー");
}
void main(String[] args) {
  println(1.plus(2)); //3
  println(4.plus(4)); //Exception
}

おそらく状態遷移マシンとかを相当シンプルに実装できるはず

いろんな例:
http://www-128.ibm.com/developerworks/library/j-alj10064.html
かっこいいなぁ
といっても、一昨年の時点でMatzにっきで触れられていた。まだまだアンテナ感度低くて反省。あと現時点でメンテしてるかどうかわからなかった*2。仕事で使うのは注意! っていないと思うけど。
ただ勉強用にはよさそう。ざっと見ただけなので、あとできちんと書く。

*1:これはJava5以降なら互角なんだけど、こっちのほうがシンプルかも

*2:wikiの最終更新が2005年...