web4rは継続渡しスタイルによるwebプログラミングを可能にします。
a/contは継続をリンクに埋め込みます。
例:
(defpage test ()
(a/cont [p "2nd page!"] "click here"))

form/contは継続をフォームに埋め込みます。
- ファイルをアップロードするには代わりにmultipart-form/contを利用して下さい
- form/contとmultipart-form/contはsubmitボタンが存在しない場合、submitボタンを挿入します
例1:
(defpage test ()
(form/cont [p "2nd page!"]))

例2:
(defpage test ()
(form/cont (let ((foo (hunchentoot:post-parameter "foo")))
(a/cont [p "You said: " foo] "click here"))
[input :type "text" :name "foo" /]))

page-lambdaはページ手続きを生成します。page-lambdaはパスやget/postパラメーターを束縛する為に利用します。
例:
(defpage test ()
(form/cont (page-lambda (:post foo)
(a/cont [p "You said: " foo] "click here"))
[input :type "text" :name "foo" /]))
; => 生成ページはひとつ前の例と同じ
form/cont内の(last-post NAME)はコンパイル時にNAMEという名前のpostパラメーターを束縛するコードへと展開されます。
例:
(defpage test ()
(form/cont (a/cont [p "You said: " (last-post "foo")] "click here")
[input :type "text" :name "foo" /]))
; 展開イメージ:
; (defpage test ()
; (form/cont (let ((#:G1152 (hunchentoot:post-parameter "foo")))
; (a/cont [p "You said: " #:G1152] "click here"))
; [input :type "text" :name "foo" /]))
; => 生成ページはひとつ前の例と同じ