Arcからの挑戦
SeaSideですごく短く書いてる例があったので、実際に動かしてみる。
Said を WAComponent ではなく WATask のサブクラスとして作成し、#renderContentOn: ではなく #go を次のように再定義。
http://d.hatena.ne.jp/sumim/20080229/p2
click here は別にリンクでなくとも、ページを間に挟みさえすればよい…という解釈でよいなら ClickHere すら不要で self infrom: 'click here'. で済ませることができて最短解。
お題
URL said (例えば http://localhost:port/said )は、入力フィールドひとつと、送信ボタンひとつのページを生成する。
http://practical-scheme.net/wiliki/wiliki.cgi?Arc%E3%81%8B%E3%82%89%E3%81%AE%E6%8C%91%E6%88%A6
送信ボタンが押されたら、2番めのページとして、"click here." と書かれたリンクひとつのページを生成する。
それがクリックされたら、3番めのページとして、"you said: ..." と書かれたページにいく。
Saidクラス定義
最新版のsqueakはGUIの雰囲気もがらりと変わっていて新鮮。
クラス定義は、クラスリファクタリング→新規クラスというメニューを選択して、クラス名、親クラス名、クラスカテゴリを順に答える方式のようだ。
が、UndefinedObject(Object)>>doesNotUnderstand: #isMeta というエラーでクラスが定義出来なかった。
とりあえずクラスペインを選択して以下を手打ちして先に進む。
まあこの部分はファイルベースの処理系なら新規ファイル作成みたいなことだろうから比較対象外だろう。
WATask subclass: #Said instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Seaside-Examples-Misc'
goメソッド定義
ここが本番。メソッドペインを選択して以下のコードを入力。
go | foo | foo := self request: ''. self inform: 'click here'. self inform: 'you said: ', foo
saidアプリケーション登録
ワークスペースで以下をdoit。
まあこの部分はpublic_htmlにsaid.htmlを持ってくるようなことだろうから…(略)
あ、でもArcの場合はdefopがこれをやってることになるのか。
Said registerAsApplication: 'said'
アクセス
http://localhost:9090/seaside/said
入力フォームページ→click hereページ→you saidページ→入力フォームページとループするようだ。
入力フォームに別の値を入れてOKした後でも、前のclick hereページのURLにアクセスしてOKをクリックすれば前の入力値でのyou saidページが出る。
感想
なるほど、確かにこういうことをするときは継続渡しは便利なのかも。
継続(Continuation)を使えば、途中まで実行した手続きをクロージャで保持し、しかも途中から処理を再開するルーチンをコールできる!
http://forza.cocolog-nifty.com/blog/2008/03/itseasarrubypf_bf37.html
つまり、投稿した後の処理を継続(Continuation)を使って、ログイン認証成功後に呼び出すように表現できるのが、Kahuaなどの継続Webフレームワークの最大の特徴なのだ。
Arc版
元ネタのArcでの場合
Arc起動
$ mzscheme -m -f as.scm Use (quit) to quit, (tl) to return here after an interrupt.
コード入力
arc> (defop said req (aform [w/link (pr "you said: " (arg _ "foo")) (pr "click here")] (input "foo") (submit))) #<procedure:gs2413>
サーバ起動
arc> (asv) ready to serve port 8080
アクセス
http://localhost:8080/said