yamasushi(2013/03/22 11:38:23 UTC)sxpathのwrapperを書いてみました。$マクロで使うときのために、sxpath*などを用意しました。
; if-sxpath , if-car-sxpath が名前空間を渡せないので作った補助 (define-module sxpath-helper (use sxml.sxpath :prefix sxml:) (export sxpath if-car-sxpath if-sxpath car-sxpath sxpath* if-car-sxpath* if-sxpath* car-sxpath* ) ) (select-module sxpath-helper) ;返り値を拡張する ; ok?....これに失敗すると返り値は#f ; fが関数でないなら#f (define (if-*fn$ f ok? :optional (trans identity) ) (and (procedure? f) (^ arg (let1 r (apply f arg) (and r (ok? r) (trans r) ) ) ) ) ) (define if-listfn$ (cut if-*fn$ <> pair? ) ) (define if-car-listfn$ (cut if-*fn$ <> pair? car ) ) (define if-stringfn$ (cut if-*fn$ <> (complement string-null?) ) ) (define (sxpath . arg) (guard [e [else (pretty-print e) ] ] (apply sxml:sxpath arg) )) (define (if-sxpath xpath :optional (ns '())) (if-listfn$ (sxpath xpath ns) ) ) (define (if-car-sxpath xpath :optional (ns '())) (if-car-listfn$ (sxpath xpath ns) ) ) (define (car-sxpath xpath :optional (ns '())) (car-listfn$ (sxpath xpath ns) ) ) (define (sxpath* xpath ns sxml) ((sxpath xpath ns) sxml ) ) (define (if-sxpath* xpath ns sxml) ((if-sxpath xpath ns) sxml ) ) (define (if-car-sxpath* xpath ns sxml) ((if-car-sxpath xpath ns) sxml ) ) (define (car-sxpath* xpath ns sxml) ((car-sxpath xpath ns) sxml ) )
Tags: sxml.sxpath, SXML, SXPath