Posted 2020-04-10 21:00:30 GMT
CLでSRFI、今回移植したのは、SRFI 115: Scheme Regular Expressionsです。
srfi-115は、S式で記述する正規表現で、その表現形式は古くからあるThe SRE regular-expression notation記法を軸にしたものです。
作者のAlex Shinn氏は、IrRegular ExpressionsというS式正規表現のライブラリを作成していて、大体そのサブセットがsrfi-115としてまとまったようです。
Common Lispへの移植は、ドラフト時の2013年に一度試してみたのですが、さすがにドラフトだと結構変更があるようなので、ファイナルまで落ち着くまで様子見してたら7年位経過していました。
参照実装をコピペしただけに近いですが、参照実装には、regexp->sre
等の便利ツールが含まれていません。
また仕様自体も核と拡張部分にわかれていますが、参照実装は、核の部分のみのようです。
ドラフトの時はほぼIrRegular Expressionsと同じようなものでしたが、合意が取れなさそうなところはどんどん削って核にしてしまい、残りは拡張部分となったのでしょうか……。
実用面では、IrRegular Expressionsの方が便利なので、Common Lispへの移植し甲斐があるのはIrRegular Expressionsの方でしょう。
ライブラリのサブセットを仕様として定義した例はCommon Lispにも多数ありますが(loop
、format
等)、中途半端なことになりがちな気がします。
(regexp-search '(w/nocase "foobar") "abcFOOBARdef")
→ #<Regexp-Match 4020002B23> (regexp-replace "n" "banana" "k")
→ "bakana"
(regexp-replace-all '("aeiou") "hello world" "*")
;; or (regexp-replace-all '(or "a" "e" "i" "o" "u") "hello world" "*")
→ "h*ll* w*rld"
(regexp-split "a" "banana")
→ ("b" "n" "n" "")
(regexp-extract '(+ numeric) "192.168.0.1")
→ ("192" "168" "0" "1")
Ultralispに登録してみたので、
(ql-dist:install-dist "http://dist.ultralisp.org/")
してあれば、
(ql:quickload :srfi-115)
でインストール可能です。
Common LispにSchemeのコードを移植する際に、どうしようかなと悩むのが、:
をシンボル名として使うにはエスケープしなければいけないことだったりするのですが、今回は、:
を$
に置き換えました。
しかし、:
をエスケープして\:
と書いてもSchemeでは問題ないですし、コードの共用という面では別の文字に置き換えたりせずに、\
でエスケープの方が良いかもしれません。
Common LispでS式正規表現だと、cl-irregsexpというのがあります。
IrRegular Expressionsも似たような名前ですが、なんか付けたくなるような名前なのでしょう。
Uncommon Lisp(R3RS Scheme)系の命名に似てますね。
■
HTML generated by 3bmd in LispWorks 7.0.0