正規表現に詰まりまくってた。

  • #/regexp-spec/で'|(or)'が使えない。
(#/a|b/ "abcdf") ; エラー

どうも'|'を使用するとシンボル名として解釈しにいってしまう様子。
正規表現に限らず'|'がEmacsのScameモードで上手く解釈できないらしい。
(string->regexp "a|b")なら正常動作するので通るのでとりあえずはそれでやり過ごす。

  • (#/b+/ "aaabbccbbb")が一件しかマッチしない。
(rxmatch-num-matches (#/b+/ "aaabbccbbb"))
1           ; 想定してた数は2

マッチする文字列をリストが欲しいのだが、これではマッチ後の文字列を更に正規表現にかけなくてはならない。
どうやらこれは正しい仕様の様子。

(define (rxmatch-list regexp string)
  (cond [(regexp string) => (lambda(x) (cons (x) (rxmatch-list regexp (x 'after))))]
        [else '()]))

マッチする全ての文字列のリストが欲しい場合はこんな感じか?
Gaucheのバージョンが0.8.8-2(現在apt-getで手に入るバージョン)では動かないかも。