トップ «前の日記(2007-10-02) 最新 次の日記(2007-10-09)» 編集

Route 477



2007-10-04

[scheme] SXMLのあんまり好きでないところは

属性を「@」で表現するところだ。

(p (a (@ (href "index.html") (class "english"))
      "-> English page"))

例えば「属性は:から始める」とかの方が、シンプルで好きだな。

(p (a (:href "index.html") (:class "english")
      "-> English page"))

うーん、でもこれだと変な木構造になっちゃうか。

(p (a (@ href "index.html" class "english")
      "-> English page"))

こんなのはどうか。

…微妙だ。

[ruby] $<.any? で「標準入力から1行読み捨てる」という意味になるらしい

http://jarp.does.notwork.org/diary/200710a.html#200710031

なんでこれで「入力を1行おきに出力」になるんだぜ?

yhara@meteor:~/src % cat nums.txt 
1
2
3
4
5
yhara@meteor:~/src % ruby -p -e '$<.any?' < nums.txt
1
3
5

できた!ふしぎ!

えーと、$<はARGFのことで、オプション-pだから、これは

ruby -e 'while(gets) do ARGF.any?; print $_; end

と一緒だろ。$_は「最後にgetsかreadlineで読み込んだ文字列」で…。

ああそうか、ARGFのany?メソッドを呼ぶと、内部でARGF.eachが呼ばれて、で最初の一行を読み込んでyieldしたところでany?がtrueを返すから、 結果的に「getsもreadlineも使わずに1行読み捨てる」が可能になるわけか。

なるほどなあ(笑)。

[scheme] GaucheでHTMLを操作する

htmlpragでhtmlからsxmlに変換するのがよさげ。

んで、sxml.ssaxとか sxml.sxpathで操作する。

(use file.util) 
(load "./htmlprag.scm") 
 
(define sxml (html->sxml (file->string "hoge.html"))) 

(display (length (sxml:child-nodes sxml)))

こんな感じか。

SSAXを使うと、「あるノードが見付かったとき」などのイベントに対するコールバックを定義する形でsxmlのパーサが書ける。

sxpathを使うと、CSSセレクタみたいに特定の条件を満たすノードだけを取り出したりできる。

使用例は IBM XMLの論考: SXMLとSSAXの調査が参考になりそう。