Diary?

2009-10-19
Mon

(23:43)

わざわざ些細なつぶやきに反応しなくてもとか、興味を持つ人とかいたりしねーかなー程度の観測気球をご本尊に撃墜されたら元も子もないっすよとか、なんだかんだいって檜山さんあなたこの事が書きたくて書きたくて仕方がなかったんじゃないんですかとか、まあでもそのうち書かざるを得ないでしょうとか思うので、ちょっと Caty スクリプトの現在と次のリリース、近いうちに実装される機能について実装担当よりいくつか書いてみる。

まず現在の Caty スクリプトはチューリング完全ではない。というか、チューリング完全だとパワフル過ぎて検証可能性とかにえらいこと影響が出るので、大体次のようなスクリプトが書ける程度の表現力に止めることにしている。

loggedin --as admin {
    "OK" => read-table | each {some-command|another-command|...} | print /result.html,
    "NG" => redirect /login.html
}

ただ現状の Caty スクリプトは匿名のコード辺をその都度書いていくスタイルで、再利用性に乏しい。流石にみんなコピペコードの嵐は(たとえ2,3行のスクリプトでも)嫌でしょうというわけで、次のリリースでは Caty スクリプトをファイルに保存して呼び出せる機能を追加する予定というかもう既に一応でき上がっていて、あとは細かい調整のみだったり。

/* /scripts/foo.caty */
each {some-command|another-command|...}
/* 呼び出し元 */
loggedin --as admin {
    "OK" => foo.caty,
    "NG" => redirect /login.html
}

それでこの機能を最初のリリースに入れなかった理由は、普通に実装するとチューリング完全になりかねないので、そこら辺の調整が間に合わなかったというのが大きな理由。とにかく流石にそれはマズいなーと思ったので、今のところこの機能はマクロ展開みたいな形で実装している。これなら再帰的なスクリプト呼び出しを書いたら無限ループしてエラーになるので安心だ(?)。そういえば前に却下されたユーザ定義関手は、あれも下手を打つとラムダ計算されてチューリング完全になっちまうのが却下の理由の一つだった。

それで檜山さんのエントリーにある Caty スクリプトをチューリング完全にしてしまう機能については、まあ常に使えるわけではなくて特定の環境下でのみ利用可能になるという方向性になるでしょう。具体的な事はまた次の機会にということで。

とはいえ、「マゾ・テスト」でないテスト機能は次のリリースに入れてもいいかな。例えば次のようなデータを与えると、入出力のチェックの突合せを行ってレポートを出すとか。

{
    "command": "cmd1|cmd2", // 任意のパイプライン
    "data": [
        ["input data", "expected data"],
        [{"x": 0, "y": 1}, null]
    ]
}

ちょっと試しにそういうレポートを出す機能を Caty スクリプトのみで書いてみたらビルトインにいくつか付け足すだけで書けたので、間に合う公算はあるかな。

Creative Commons
この怪文書はクリエイティブ・コモンズ・ライセンスの元でライセンスされています。引用した文章など Kuwata Chikara に著作権のないものについては、それらの著作権保持者に帰属します。