Arcからの挑戦

SeaSideですごく短く書いてる例があったので、実際に動かしてみる。

Said を WAComponent ではなく WATask のサブクラスとして作成し、#renderContentOn: ではなく #go を次のように再定義。
click here は別にリンクでなくとも、ページを間に挟みさえすればよい…という解釈でよいなら ClickHere すら不要で self infrom: 'click here'. で済ませることができて最短解。

http://d.hatena.ne.jp/sumim/20080229/p2

お題

URL said (例えば http://localhost:port/said )は、入力フィールドひとつと、送信ボタンひとつのページを生成する。
送信ボタンが押されたら、2番めのページとして、"click here." と書かれたリンクひとつのページを生成する。
それがクリックされたら、3番めのページとして、"you said: ..." と書かれたページにいく。

http://practical-scheme.net/wiliki/wiliki.cgi?Arc%E3%81%8B%E3%82%89%E3%81%AE%E6%8C%91%E6%88%A6

Saidクラス定義

最新版のsqueakGUIの雰囲気もがらりと変わっていて新鮮。
クラス定義は、クラスリファクタリング→新規クラスというメニューを選択して、クラス名、親クラス名、クラスカテゴリを順に答える方式のようだ。
が、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)を使えば、途中まで実行した手続きをクロージャで保持し、しかも途中から処理を再開するルーチンをコールできる!
つまり、投稿した後の処理を継続(Continuation)を使って、ログイン認証成功後に呼び出すように表現できるのが、Kahuaなどの継続Webフレームワークの最大の特徴なのだ。

http://forza.cocolog-nifty.com/blog/2008/03/itseasarrubypf_bf37.html

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