S式のわかりにくさ
どう書く.orgの問題を解くのに、html-parseというものを使ってみました。
http://franz.com/support/documentation/8.0/doc/phtml.htm
htmlをLHTML(S式)に変換してくれる関数が提供されています。S式で表現することは、Lisp的には自然な方法なんだと思いますが、正直どうも扱いにくかったです。(修行が足りないのは置いといて)
1. a string containing text content, such as “Here is some text with a “
2. a keyword package symbol representing a HTML tag with no associated attributes or content, such as :br.
3. a list representing an HTML tag with associated attributes and/or content, such as (:b “bold”) or ((:a :href “help.html”) “link”).
属性も内容も存在しないタグは、剥き出しのsymbolとして表されて、内容がある場合は、(タグ名 内容+) のリストとして表わされて、属性があるときは、(タグ名 [属性名 属性値]+) のリストで表わされる。これが組み合わさるので結構複雑。要素の意味がsymbolの出現する位置に依存してるから複雑なのかな?
今回挑戦した問題では、html-parse:parse-htmlの出力したLHTMLを解析して、逆パースするような処理として書いたので、symbolp listp をごにょごにょして、上の3パターンを判定していく必要がありました。
例えば、構造体で返却されたらもっと扱いやすいと思いました。LHTML(S式)と構造体の比較をしてみました。
LHTML(S式)
(:p "Here is some text with a " (:b "bold") "word" :br "and a" ((:a :href "help.html") "link"))
構造体
#S(TAG :NAME :P :CONTENTS ("Here is some text with a " #S(TAG :NAME :B :CONTENTS ("bold")) "word" #S(TAG :NAME :BR) "and a" #S(TAG :NAME :A :ATTR (:HREF "help.html") :CONTENTS ("link"))))
うゎ、書いて再認識しました。やっぱ構造体は冗長。でもこのデータを弄るプログラムは明快になると思います。java的な頭が抜けきらないからこう感じるのか、それともS式をもっと上手に扱う定石的な方法があるのかもしれないです。
追記 2007/09/08
このわかりにくさの話は、S式一般のわかりくさではなくて、LHTMLのわかりにくさでした。でもマクロを書くときには、似たようなごたごたしたS式のparseが必要になることは多いと思っています。