第2回 Kahuaセミナー資料 > Kahuaプログラミング/デバッグ手法 > 三種類の記法 > 高階タグ関数形式


[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

高階タグ関数形式 応援する 

高階タグ関数

シンボル形式は単なるリストだ。 単純タグ関数は単純タグ関数のノードを引数にとり、 シンボル形式のリストを返した。
高階タグ関数は高階タグ関数のノードを引数にとり、 高階タグ関数のノードを返す。

hello(1iv:2mkr9)> (input/ (@/ (type "text") (name "data")))
#<closure (>>= >>=)>

hello(1iv:2mkr9)> (td/ "1")
#<closure (>>= >>=)>

hello(1iv:2mkr9)> (tr/ (td/ "1") (td/ "2") (td/ "3"))
#<closure (>>= >>=)>

hello(1iv:2mkr9)> (tr/ (node-set (list (td/ "1") (td/ "2") (td/ "3"))))
#<closure (>>= >>=)>

hello(1iv:2mkr9)> (tr/ (node-set (map td/ '("1" "2" "3"))))
#<closure (>>= >>=)>

高階タグ関数は常に#<closure (>>= >>=)>というclosureを返す。 このclosureはブラウザの一部もしくは全体に HTMLの部品を描き出すという機能を表現している。

したがって、テーブルを書き出すclosureとリストを書き出すclosureを html/に与えるとブラウザ全体にテーブルとリストを それぞれの与えられたエリアに描き出すというclosureを合成して返してくる。

hello(1iv:2mkr9)> (define tbl (table/ (tr/ (td/ "1") (td/ "2") (td/ "3"))))
tbl

hello(1iv:2mkr9)> tbl
#<closure (>>= >>=)>

hello(1iv:2mkr9)> (define lst (ul/ (li/ "a") (li/ "b") (li/ "c")))
lst

hello(1iv:2mkr9)> lst
#<closure (>>= >>=)>

hello(1iv:2mkr9)> (define page (html/ tbl lst))
page

hello(1iv:2mkr9)> page
#<closure (>>= >>=)>

高階タグ関数の展開形

高階タグ関数の場合、シンボル形式や単純タグ関数形式の様に 直接展開形が見えない。 展開形のチェックは次のような関数を使って確認するしかない。

(define (node->sxml node)
  (rev-nodes (exec () node)))

これを用いれば、

hello(1iv:2mkr9)> (node->sxml tbl)
((table (tr (td "1") (td "2") (td "3"))))

hello(1iv:2mkr9)> (node->sxml lst)
((ul (li "a") (li "b") (li "c")))

hello(1iv:2mkr9)> (node->sxml page)
((html (table (tr (td "1") (td "2") (td "3"))) (ul (li "a") (li "b") (li "c"))))

Kahuaプログラマは最終的にシンボル形式を渡せばよいと説明したが、 実際には高階タグ関数が生成するclosureも渡すことが可能で、 返した結果がclosureなら、上記の通りに展開して シンボル形式にしてから処理(HTMLにしてブラウザへリプライ)してくれる。

三種類記法があるわけだが、これらの記法を使ってみて、 自分なりに使いやすいものを使えばよいと思う。

但し、高階タグ関数形式は他の形式と混在してコードを書けないので注意 。


[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

このサイトについて|ヘルプ|Q&A|個人情報保護|プライバシーポリシー|利用規約|コメント・トラックバック規約|削除規程|広告掲載
Copyright (c) 2005-2007 Time Intermedia Corporation