Get It:
Download
Change Log
Learn It:
Install
Tutorial
API Doc
Discuss It:
Mailing List
Follow It:
Code

Tutorial Part 4. 継続渡しスタイル

web4rは継続渡しスタイルによるwebプログラミングを可能にします。

CPSでwebプログラムを書くメリット

a/cont

a/contは継続をリンクに埋め込みます。

例:

(defpage test ()
  (a/cont [p "2nd page!"] "click here"))

cps1

form/cont

form/contは継続をフォームに埋め込みます。
- ファイルをアップロードするには代わりにmultipart-form/contを利用して下さい
- form/contとmultipart-form/contはsubmitボタンが存在しない場合、submitボタンを挿入します

例1:

(defpage test ()
  (form/cont [p "2nd page!"]))

cps2

例2:

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

cps3

page-lambda

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" /]))

; => 生成ページはひとつ前の例と同じ

last-post

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" /]))

; => 生成ページはひとつ前の例と同じ