Java は近代の言語、Ruby は現代の言語、Curl は未来の言語

タイトルは釣りでもなんでもなくて、大まじめ。

Curl というのは、MIT の人たちが作ったリッチクライアント用言語。もともと軍隊で兵士につけるデバイス用のアプリを作るために開発されたらしい。だから少ないリソースでも高速に動作し、バカでも分かるGUIを備え、ネットワークが繋がっていてもいなくても同じように動くよう設計されたんだとさ。

リッチクライアント製品としての Curl も面白いんだけど、プログラミング言語としての Curl はもっと面白い。まじで次世代の言語だと思う。

以下、その理由。

静的にも動的にもできる

Curl は基本的に、静的な型を指定する言語。しかし型を指定しなくても構わない (その場合は any という型が指定されたと見なされる)。
ほかの言語はたいがい、静的な言語では必ず型を指定しなくてはならず、逆に動的な言語では型を指定することができない。つまり型を指定するかしないかをユーザが選ぶことはできず、言語開発者しか選ぶことはできなかった。
しかし Curl では、型を指定する・しないはユーザに任せられている。つまり、型を指定したい人は指定すればいいし、めんどくさければ指定しなくていい。
なんという choosability の高さ! これこそ言語本来のあるべき姿だ。未来の言語では、静的・動的の論争はもはや必要ない。
ただし、C# の var のような、初期値で型を決定するという機能はない。ここは残念。

プログラムだけでなくコンテンツも作成できる

今の Web アプリケーションは、サーバサイド用の言語 (Ruby/PHP/Perl/Python/Java/...) だけでは完結しない。HTML、CSSJavaScriptXMLJSON、その他もろもろの知識が必要になる。
しかし、ほんとうにこれらをすべてマスターしなければいけないのだろうか。たかがアプリひとつ作るために、どうしていろんな言語を使わないといけないのか。
Curl なら、このような心配はいらない。Curl だけで、プログラムもコンテンツも両方作成できる。つまり、CurlJava にも HTML にも CSS にも JavaScript にもなれるわけだ。サーバサイドとクライアントサイドで違う言語を使う必要もない。どっちも Curl で完結できる。
しかも、Web アプリだけでなくふつうの GUI も作成できる。つまり Curl は Swing にもなれる。また Curl による GUI 作成は、HTML や CSS を使うような感覚で行なえる。Swing のような、ばかばかしいほど長いコードを書く必要はない。

数値に単位をつけられる

Curl では数量型という概念がある。これは、数値に単位系をくっつけたもの。これを使うと、コードがたいへん分かりやすくなる。
例えば「10kg」と書けば、重さを表す数量型になる。単なる「10」ではない、単位を伴った数量なのである。だから「10kg==10000g」は true であるし、「10kg==10m」は false である (そもそも異なる単位系の数量型を比較すると、コンパイル時にエラーとなる)。
また既存の数量型から、新しい数量型を定義することもできる。たとえば、Velocity は Distance を Time で割った数量型だという定義が可能で、54km / 3.0hr = 5.0m*s^-1 という値がそれになる。もちろん単位系まで考えてコンパイルエラーがでる。
Ruby on Rails では 1.hour とか 2.month とかできて大変便利だけど、それを知っている人なら Curl の数量型がいかに便利かわかるだろう。数量型はさらに Time や Date 以外の SI 単位系全般で使えて、かつ型システムと結びついているからすごい。
ここまでくると、静的な型があってよかったと誰もが思うだろう (Rubyist や PHPer でもそう思うはず)。数量型を知ると、C#Java のような型システムがいかに時代遅れかということを思い知らされる*1

コンストラクタを上書き可能

ファクトリという機能を使うと、コンストラクタを上書き (横取り) できる。
この機能を使うと、なんと抽象クラスを new することができるようになる (このとき、ファクトリは抽象クラスを継承した具象クラスのインスタンスを自前で生成して返する必要がある)。
たとえば、抽象クラス Button クラスを new したときに、プラットフォームによって Win32Button が返されたり CocoaButton が返されたりするようなことが可能。これは abstract factory pattern より自然で使いやすい。
ほかには、new してるんだけど実は毎回同じオブジェクトを返すようにすれば、singleton pattern になる。singleton pattern にしてもしなくても、使い方は変わらないことに注意 (他の言語のように getInstance() とかを使う必要がない)。

キーワード引数や可変長引数をサポート

Curl では、当然のようにキーワード引数をサポートしている。
キーワード引数をサポートした言語としては Python が知られていてるが、Python では位置引数とキーワード引数の区別がないのに対し、Curl では「デフォルト値が指定された引数はキーワード引数、それ以外は位置引数」というわかりやすい仕様になっている*2
あと、可変長引数もサポートしている。これは、位置引数とキーワード引数の両方に対応していて、Python でいうところの *args と **kwargs の両方を兼ねている。

インスタンスごとのプロパティをサポート

Curl では、ちょうど JavaScript と同じように、インスタンスごとのプロパティをサポートしている。これは、Curl ではオプションと呼ばれている*3
オプションがインスタンス変数と違うのは、それがクラス構造による継承ではなく、インスタンスによる継承であるということ。だから継承構造を実行時に変更することができる。
これは、JavaScript で __parent__ を変更するとプロパティの値が変わるのと同じ。

その他

  • 本格的なオブジェクト指向言語
  • 多重継承をサポート
  • アクセッサをサポート
  • クロージャをサポート
  • パラメータ化クラスをサポート
  • 多彩なコンテナクラスが標準装備
  • null を取る型とそうでない型を指定可能
  • タグつきbreakをサポート
  • Array や HashTable の要素に a[1] や h["key"] でアクセス可能 (← 素晴らしい)
  • switch 文で使う比較演算子を指定可能
  • readability のために、戻り値の宣言に名前をつけられる (← 渋い!)
  • 超高速かつ省資源
  • 標準でグラフィックス (2D, 3D) やサウンドAPI を用意

・・・もうね、ほんと他の言語なんかいらないと思ってしまうくらい、よくできてる。MIT 万歳! Curl に比べれば、RubyJava もウンコ。あとはフリーの実装さえ出てくれれば、いうことなし。


あ、でも、初期値の型から変数の型を決定する機能は欲しい。

|| これはめんどくさい
{let comp:{proc-type {String, String}:bool} =
    {proc {s1:String, s2:String}:bool
        {return s1.size < s2.size}
    }
}

|| やっぱりこう書きたい
{let comp:=
    {proc {s1:String, s2:String}:bool
        {return s1.size < s2.size}
    }
}

*1:ただ、CSS では数値に単位をつけられるのが当たり前なので、今後登場する言語では、単位系をサポートするのがふつうになるかもしれない。

*2:もしかしたら、それは CommonLisp から受け継いだ仕様かもしれない。わかんないけど。

*3:ただ、この機能は Visual クラスを継承したクラスで利用可能だから、ライブラリとして実現されているのかもしれない。