GaucheでAtomを読み込む

最近Gaucheで作ろうと思っているプログラムで、XMLを読み込む必要があるので、その準備の意味も兼ねて適当に書いてみました。
http://d.hatena.ne.jp/myomi/20080505/1209995681 ここを参考にして書いてみました。

; Atomを読んでタイトルを表示する
(use sxml.ssax)
(use sxml.sxpath)

(define atom "<?xml version=\"1.0\" encoding=\"utf-8\"?>
<feed xmlns=\"http://www.w3.org/2005/Atom\">
  <title>test</title>
  <link href=\"http://www.example.com/\"/>
  <updated>2010-02-11T09:00:00Z</updated>
  <author>
    <name>tana</name>
  </author>
  <id>test:testtesttest</id>
  <entry>
    <title>testest</title>
    <link href=\"http://example.org\"/>
    <id>test:aaaaaaaaa</id>
    <updated>2010-02-11T09:10:00Z</updated>
    <summary>test test test test test</summary>
  </entry>
  <entry>
    <title>aaaaaaaaaaaaaaaaaaa</title>
    <link href=\"http://example.com\"/>
    <id>test:bbbbbbbbbbb</id>
    <updated>2010-02-11T09:12:00Z</updated>
    <summary>aaaaaaaaaaaaaaaaaaaa</summary>
  </entry>
</feed>")

(define (get-title atom)
  (let ((sxml (ssax:xml->sxml (open-input-string atom)
                             '((feed . "http://www.w3.org/2005/Atom")))))
    (map cadr ((sxpath '(feed:feed feed:entry feed:title)) sxml))))

(define (main args)
  (for-each print (get-title atom))
  0)

Atomの、entryのtitle要素の内容を列挙します。
「ssax:xml->sxml」という関数でXMLの文字列をSXML(XMLをS式にしたもの)に変換しますが、「'((feed . "http://www.w3.org/2005/Atom"))」という部分で、XML名前空間を付けています。
そうすることで、「feed:entry」のような書き方を使えるようになります。
次に、「sxpath」という関数で、SXPath(XPathをS式にしたもの)を使って要素を取り出します。
sxpath関数は、関数を返すので、返ってきた関数にSXMLを渡すと要素を取り出せます。
「(map cadr」のところは、sxpathを使って要素を取り出すと、「((feed:title "title要素の中身") (feed:title "中身"))」のようになるので、それを「cadr」を使って中身だけ取り出しています。
そうして取り出したtitle要素の中身のリストを、「for-each」を使って出力しています。

今回は、かなり意味不明の文章になってしまったと思います。申し訳ございません。