Zedが今度はPGの「Arc Challenge」に挑戦状。Luaによる継続スタイルのマイクロフレームワーク。

http://sheddingbikes.com/posts/1289384533.html

話題の絶えないZed。また彼の強力なパーソナリティに関する話になってしまうが、その前にこれは本当のZedが作っているキャラであって、ハッカーとしての真価は彼のプロジェクトによって評価されるべきだと言っておきたい。この数ヶ月にPythonの入門書を書き上げ、Mongrel2をリリースし、さらにLuaでco-routineいよるマイクロフレームワークを構築するなど、面白い実験を行なっている。凄い出力だ。

さて、ドラマの始まり。PGの言語Arcは「プログラムを最短化するのを目的とする言語」ということになっている。その意味を明かにするために「Arc Challenge」なるものを提唱した。次のウェブアプリを何行で書けるか?

  • ユーザにインプットを尋ねる
  • 中間ページを見せリンクを表示
  • そのリンクを辿ると元のインプットが表示される
  • URLにインプットを入れるのは反則

Arcの回答は


(defop said req
(aform [onlink "click here" (pr "you said: " (arg _ "foo"))]
(input "foo")
(submit)))
これに対してZed曰く: 「そうか。何やってんだか全然わからない」

「最初にこれを見たとき「WTF?」(なんじゃこりゃ)と思った。Lispはやったことがるが、意味がわからない」

Lispの問題は、君のコードを理解できるのは君と空飛ぶスパゲッティーモンスターだけになってしまうまでのmetaprogramを受け入れてしまうことだ」

ArcWTF Challenge

なので、「ArcWTF Challenge」を提唱する

  • Arc Challengeの回答を(任意の言語・フレームワークで)書く
  • ウェブアプリケーションを立ち上げる
  • エディターで君のコードとArcのを並べて表示する
  • プログラムを書けない人にブラウザでアプリを使わせる
  • 何も説明しないで、Arcコードを見せて、「これは何するもの」と尋ねる

ここでその人はWTF?と言うだろう

  • 次はその人に君のコードを見せる

もし何やっているのかわかれば第一ラウンドは勝ち。

  • どっちのファイルがウェブアプリを動かしているのかと尋ねる。

もし君のが選ばれたら最終ラウンドも勝ち。

プログラマでない人にコードを見てても区別はつかないだろうが、Zedの言いたいことはわかる。究極の簡潔さよりも読み安さを求めろってことでしょ。

LuaによるZedの「Arc Challenge」の回答は


require 'tir/engine'

local prompt_page = Tir.view("index.html")
local link_page = Tir.view("link.html")
local reply_page = Tir.view("response.html")

local prompt_form = Tir.form {'msg'}

local function arc(web, req)
local params = {}

repeat
params = web:prompt(prompt_page {form = params})
until prompt_form:valid(params)

web:page(link_page {})
web:click()

web:page(reply_page {form=params})
end

Tir.start {route = '/arc', main=arc}

詳しくは元記事を参照: http://sheddingbikes.com/posts/1289384533.html

Zedのコメント:
ちくしょう。TirはArcにボロ負けだ。23行もの読める、理解できる、きれいにフォーマットされた完全なデータストアを必要としないLuaコードだ。、、、しかも入力値を確認しエラーメッセージも表示する。さらに、テンプレートは誰でもいじれる普通のHTMLだ。

一つの関数の中で複数のHTTPトランズアクションが発生するcontinutationスタイルを使っているところはArcと同じようだ。ちなみに、Perlによるこの手法は以前取り上げたことがある: http://d.hatena.ne.jp/karasuyamatengu/20090908/1252441668

このTirというのは、Mongrel2の開発に合せてZedが作ったLuaによるマイクロフレームワークだ。Pythonの本を書き終えて、Pythonに飽きてしまったZedはLuaにハマっているようだ。まだ走らせていないのでよく理解しないが、要点を訳してみると:

「インターフェース」にはプロセスと関数が与えられる

OSプロセスなのか言語のライトウエイトプロセスなのかは不明

ハンドラは「普通のロジック」で書ける

上記の継続スタイルのことを言っているのだと思う
HTTPリクエスト毎にハンドラを書かないで、一つの関数で普通の流れで書けるということだろう。

ハンドラは自分の状態を管理し、ユーザはその中で長い時間を過さないので、seasideのようなアップグレードやスケーリングの問題があまりない。

JinjaのようなLuaシンタックスを使ったテンプレート

500行のファイルに収まり、コマンド制御スクリプトもついてくる

ハンドラはZeroMQを介してMongrel2と話すので、超カッコイイ水平スケーリングが可能。

Tenguはちょっと忙しくてこのTirを探る余裕がないので、有志のZedファンは試してブログで報告してください。