2006/01/26

なんらかの構文をルールにしたがってマークアップしたいときに、どんなテキストフィルタを使えばいいかという話。ことに、直前のフィルタリングの結果を次のフィルタリングで上書きされないようにする方法の正解はなんだろう。最初にきちんと構文を解析するのが、もっとも間違いがなく、robustであるのは認める。けれども、よほど汎用性のあるフォーマットでないかぎり自分で構文解析までするのは非現実的だと思う。誰かが、ちょうど自分の目的にあったものを書いてくれていれば、積極的に流用したい。けど、その目的のものを探すコストがばかにならないことも多い。
それなら、「アドホックさ」と「再利用性」のあいだのどこかでバランスをとった解決方法を、その場で作り出すしかないんじゃないかと思う。

「直前のフィルタリングの結果を次のフィルタリングで上書きされないようにする方法」に関しては、とりあえずこんな方法しか思いつかないんですが、この程度の再利用性があればいいんじゃない? だめ?
(define (regexp-replace-delimiter-all* str . args)
(define delimiter "%%%")
(define (set-delimiter str)
(string-append
delimiter
(string-join (map x->string (string->list str)) delimiter)
delimiter))
(define (erace-delimiter str)
(regexp-replace-all (string->regexp delimiter) str ""))

(if (eq? (remainder (length args) 2) 1)
(error
"Need even args -- REGEXP-MATCH-REPLACE*"
args)
(if (null? args)
(erace-delimiter str)
(apply regexp-replace-delimiter-all*
(append
(list (regexp-replace-all
(car args)
str
(set-delimiter (cadr args))))
(cddr args))))))


gosh> (regexp-replace-delimiter-all* "abcde" #/a.*?c/ "xx" #/xd/ "zz")
=>"xxde"

No comments :