青山です。

On Mon, May 13, 2002 at 04:20:37PM +0900,
 Taku Nakajima wrote:

> Walrusでは、ブロックが配列を返すと結果を連結して処理するようにしています。
> 
>   html = e(:p) do
>     [
>       "Ruby's home page is ",
>       e(:a, :href=>"http://www.ruby-lang.org") { "here" },
>       "."
>     ]
>   end

なるほど、これは良さそうですね。... ですが、単純に文字列を積み重ねてい
る cgi.rb ベースでは、e(:a) の処理が e(:p) よりも先に終るので、順番が
おかしくなるという問題が起こってしまいます。

ヒアドキュメント中で #{e(:a){}} のような式展開を使った場合の問題と同じ
ような感じですね。逐次積み重ねを行うタイプでは、評価のタイミングに結果
が左右されてしまうので。

これを回避するには、Walrus のように後でまとめて展開するような感じにな
るかと思われますが、ある程度の軽さとシンプルさを重視したいので、残念な
がら、見送らせて頂きます。

> e()が汎用のhtml生成のメソッドですが、def_tagというクラスメソッドを利用し
> て、個別の専用メソッドを用意することもできます。

ああ、そういえば、cgi-lib.rb には似たような機能があって、その機能はあっ
ても良いかなと思っていました。忘れないようにしておきます。

> なお、Walrus(OBAQ)の実装は、木構造のオブジェクトを生成してから文字列に変
> 換しています。だからcgi.rbよりオーバーヘッドが大きいと思います。目的も違
> うのでこれがそのままcgi.rbに使える可能性は少ないと思いますが、一応、この
> ような方法もあるということで参考までに。

ありがとうございます。そうですね、cgi.rb 関連は標準添付という事からも、
Ruby の長所である、使いやすさ、読みやすさ、書きやすさを感じられる物、
そして、ある程度軽い物にしたいと思っています。


-- 
青山 和光 Wakou Aoyama  <wakou / fsinet.or.jp>