[PHP-users 20448]Re: 再帰(?)正規表現置換について

Osamu Shigematsu shige @ ravi.ne.jp
2004年 2月 19日 (木) 10:00:50 JST


重松です。こんにちは。

> 確かに、この場面においては、不便なbehaviourですね。
> 理屈はわかるし、回避できなくもないので、まあしょうがないかという感じ。

私は理屈がわかりません。

宇野さんにはお分かりとのことなので、教えていただけるとうれしいのですが、
もし、"" の中で使いたいのならば、' や $ や {} などを適切にエスケープしな
ければ、意味を成さないと思います。

逆に、'' の中では、' 自身を使う方法がありませんから、先の対症療法にも自
ずと限界があると思います。

もし、こういう問題点をわかった上で、Perl との互換性を優先してそういう動
作に百歩譲ってなっているのならば、それはすなわち、意図した仕様なのだから、
それなりの説明が、ユーザのツッコミ欄にではなく、マニュアル本体にあってし
かるべきと思いますし、そういうことがない現状、単に気づいていないだけ、す
なわちバグだろうというのが、私がそう考えた理由です。

> 最初の質問内容を見てお題がテンプレートエンジンなのが分かったので、
> 面白そうだなと思って。仕様を理解するにはテストを書くのが一番ですし。
> (ユニットテストやテストドリブン大好き)
> 
> テストコードを書いて思ったことを一つ。
> _parse()は変換処理(文字列I/Oのみ)、parse()はファイル操作とinclude、
> と明確に役割分担されていたら_parse()のテストが書きやすいなー、と。
> つまり、parse()側での呼び出しが
> file_put_contents($dst, html_template::_parse(file_get_contents($src));
> みたいな感じです。速度に悪影響があるかもしれませんが。

まだ速度は計ってません。

が、それなりに気をつけたつもりではいます。

たとえば、@count() にしても、これだけで、
(1) 変数が定義されいるかどうか
(2) 変数が定義されている場合、配列かどうか。もしそうなら、空でないか
を一発で求めています。

本当は、def というよりも、if にしたい気もしたので、

 if (@count($hoge) && $hoge !== false) {

としたかったんですが、コンパイル後のソースは毎回パースされるので、省きま
した。

新しい変数スコープを作る方法は、関数化 + extract がもっとも単純なのでこ
れを採用したのですが、鮎川さん方式もよい方法だと思いますが、ループに使う
配列が 0 からきちんと埋まっている必要があるので、そうでない場合は、
array_keys でも使わないとよろしくないし、だとすると、オーバヘッドがかな
り大きそうなので、foreach 方式にしました。

テストに関しては、確かに、宇野さんご指摘のように、_prase 部分を文字列 IO 
にすると楽になりそうですね。オーバヘッドもあったとしてもごく軽微だと思う
ので、そうしてみます。

> 同感です。凄いデザイナーさんは凄いんですけれど、
> その腕に依存しすぎると分業規模の拡大がしにくいですし。

そうですね。他者が介在する場合には、相手にとっての使いやすさ、というのは
とても大事だと思います。

自分は、HTML は「構造を持った階層をなすデータの表現」として捉えているの
ですが、デザイナーさんは、「画面と部品」としてみているのだと思います。な
ので、名前つきの部品をぺたぺたとおいていくやり方でないと、厳しいです。

{each}{/each}, {def}{/def} のレベルでも、

「こんなの書かなくちゃなんないんなら、俺は出来ないんだけど…。」

といわれているので、かなり先は険しそうです。
これ以上、何をシンプルにすればいいのか、悩みます。。。

-- 
Osamu Shigematsu <shige @ ravi.ne.jp>



PHP-users メーリングリストの案内