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が必要になることは多いと思っています。

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.