高階タグ関数形式 応援する  高階タグ関数
シンボル形式は単なるリストだ。
単純タグ関数は単純タグ関数のノードを引数にとり、
シンボル形式のリストを返した。
高階タグ関数は高階タグ関数のノードを引数にとり、
高階タグ関数のノードを返す。
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にしてブラウザへリプライ)してくれる。
三種類記法があるわけだが、これらの記法を使ってみて、
自分なりに使いやすいものを使えばよいと思う。
但し、高階タグ関数形式は他の形式と混在してコードを書けないので注意
。
| |
|