Island Life

< CLtL2の謎 | Great Hackers >

2004/07/26

uri.escape

天泣記 7/26

Unix では ? をファイル名に使えるので、 ~/public_html/question?mark というファイルを作れて、とある HTTP サーバ(のとある設定)では、これは http://host/~user/question%3Fmark という URI になる。

この URI を URI.escape の結果として生成できるかというと...

そもそも、URIのescape規則はURIの各コンポーネント(path, query, fragment) に対して適用されるものなんで (しかもschemeによってどのコンポーネントが decodeされるべきかが異なる)、順番を守ることが必要なはず。

  • 受ける時: コンポーネントに分割→コンポーネントごとにdecode
  • 出す時:コンポーネントごとにencode→繋げてひとつのuriに

原理的に、既にくっついちゃったひとつのuriを正しくencodeすることはできない。

そこを何とか…って わけですか。でも、%XXの'%'は変えない、というのも、 「大抵は動くがたまに動かないことがある」という嫌な動作になりそう。 (例:パラメータとしてURLを取るリダイレクタに、'#'を含むURLを パラメータとして渡した、というURLをもう一度そのようなリダイレクタに 渡した場合とか)。そんなん万に一つもないだろうから無視!というのも、 まあ、ありでしょう。 私はそういう落し穴はあらかじめ埋めておかないと不安な質なんで気になりますが。

内部的にくっつけないで持っといて、最後の最後に文字列にするって 方向だと、Common Lispのpathnameくらいちゃんと(ごちゃごちゃと)やらんと いかん羽目になりそうな気もする。

ところで、この「落し穴は潰しておきたい」というのは、たぶんSchemerの 多くに共通して見られる傾向だと思うのだけれど、自分の場合、これは 怠惰から来ているように思える。つまり、一度考えたことはもう考えたくないのだ。 特にでかいシステムを作って行く場合、コンポーネントを煉瓦のように 積み重ねてゆくわけだけど、途中の煉瓦に怪しいのがあると、 どんどん上に積んでいった時に全体が傾く。そしたら、上に積んだ煉瓦を ばらして原因を突き止めて、それを置き換えて、また上に積み直さなくちゃ ならない。それが面倒臭い。

Lightweight Languageなら取り崩しも積み直しも楽だし、 まあおおざっぱに1万行以下くらいの小さなプログラムなら たいして問題にはならないだろう。でもいつか、数十万行以上の規模の システムになった時には、土台を直すのは大変。 (行数で規模を測るのはなんだけど、目安としては通じるかと思う)。

そうは言ってもやっぱり穴はどうしても出来る。あれだけ侃々諤々と 議論して作られたR5RSにも、かなりでかい穴がある。 穴の無い仕様なんて作れないのかもしれない。が、それを夢見るのが Schemerなのかもしれん。

Tags: Programming, Scheme