Cotton Bolls: コンテンツ言語Curl
« テストファーストの判断基準 | トップページ | オブジェクト生成のUniform Access »
2004.02.08
コンテンツ言語Curl
Curlはリッチクライアント・Webアプリ用プログラミング言語として知られている.しかし,日本ではサーバーライセンスや開発環境が高価なことから,ほとんど普及してないのではないだろうか.ただ,日本語版は有料だが英語版はフリーで試せるようだ:
http://www.curl.com/
(※このサイトでは日本と韓国はダウンロード禁止と書いてあるが,個人/評価用ならかまわないらしい:http://www.curlap.com/html/about/pressroom/ide300.htmを参照)
Curlは一見するとHTMLとスタイルシートを発展させた言語のように見える.例えば,ソースコードとして
Hello {bold World}!
と書けば,
Hello World!
のようにCurlプラグインがインストールされたWebブラウザ上で表示される.おそらくコンテンツの中に中括弧でコードを埋め込めることからコンテンツ言語とよばれているのだろう.これならWebアプリを作らなくても,コード・ジェネレータに利用できるのではないかと考えたが,コマンドラインで動くツールとしては機能が弱いためメリットはないようだ.
ここまで読むと,JavaScriptのようなWebに特化したスクリプト言語,というイメージしか持たない人も多いと思う.ところが,プログラミング言語,特にオブジェクト指向の観点からみてCurlはかなりすごい言語だ.実際次の3つの機能があるということを知って非常に驚いた.
- 多重継承
- パラメトライズド・クラス
- マクロ
C++とlispの影響を受け,いいとこ取りをしているようにみえる.lispといえば括弧アレルギーの人も多いと思うが,適度に括弧を省略した文法を採用しているためそんなにひどいことはない.
上記3つのうち,多重継承については説明するまでもないと思うが,2番目のパラメトライズド・クラスは次のような感じだ.
{let pi-numbers:{Array-of int }= {{Array-of int} 3, 1, 4, 1, 5}} {let numeral:{HashTable-of int, String} = {{HashTable-of int, String} 1, "one", 2 "two", 3, "three"}}
最初のコードでは,intの配列({Array-of int}):pi-numbersを宣言し,初期化している.次のコードでは,キーがint,値がStringのハッシュ({HashTable-of int, String}):numeralを宣言し,同じく初期化を行っている.パラメトライズド・クラスをユーザが定義するのも簡単だし,any型(プリミティブ,オブジェクト型すべてを含む総称型)が使えるため,型付けの弱いスクリプト言語のような柔軟性をもつパラメトライズド・クラスを定義することも可能だ.
一番すごいといえるのがマクロ機能だ.マクロを一言でいえば,ユーザがCurlの文法をどんどん拡張していけるということだ.マクロの定義では,まずパターンと呼ばれるトークンの並びを宣言し,本体に入れ替えるべきコードを書く.僕も実際にテストケース用のマクロを作成してみた:
{testcase {SampleTest} {test-method {add} {assert-equals 1+1, 2} } }
上記の中で,testcase, test-method, assert-equalsはすべてマクロだ.これらはTestCaseを継承するクラスやテストメソッドに展開される.マクロを定義するのは正直頭がこんがらがってくるが,かなり有用な機能であることは確かだ.
他にも,ファクトリやオプション,関数の引数の扱いなど他の言語にはないような面白い機能があるが,機会があれば別のときに紹介しようと思う.
さて,ここまではCurlをほめるだけだったが,気に入らないところもあるので書いておこう.
まず一番イヤなのがJavaにおけるクラスパスのような概念がないことだ.Curlでは,パッケージに含まれるファイルやライブラリのファイル名をすべて明示的にコードに書かなければならない.つまり,コマンドライン引数や環境変数で外側から教えてやることができない,ということだ.新しいCurlのファイルを作れば,必ずそのファイル名をコードのどこかに書かなければならない.本来make等ビルドツールに任せることまでCurlでやってしまうところが墓穴をほっている気がする.
また,内部クラスがないことも痛い.UnitTestでは,MockObjectを作るために内部クラスを使う.こうすると名前空間が汚染されないからだ.詳しいことは省略するが,先ほど書いたクラスパスがないことと合わせてUnitTestを行うのを非常に困難にしている.後発の言語なら,もっとUnitTestしやすい設計をしてほしかったところだ.
最後に,一番イライラすることを書いておこう.冗長なカンマが許されないことだ.次のコードは,5の後ろにカンマがあるのでコンパイルエラーになる:
{let pi-numbers:{Array-of int}= {{Array-of int} 3, 1, 4, 1, 5, }}
これはすぐにでも変更してほしい.本当にイライラするので.
08:15 PM in Curl | 固定リンク
トラックバック
この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/172982
この記事へのトラックバック一覧です: コンテンツ言語Curl:
» Curl [mori2から]
Curl, カールと読むらしい 日本Curlユーザグループ http://park16.wakwak.com/~curl/ サーバサイドの負担を減... 続きを読む
受信: April 1, 2004 05:33 PM