#:g1: cl-matchの紹介

Posted 2014-11-07 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の312日目です。

cl-matchとはなにか

 cl-matchは、Daniel S. Bensen氏作のML風のパタンマッチのライブラリです。現在は、Tony Garnock-Jones氏がメンテナンスをしているようです。

パッケージ情報

パッケージ名cl-match
Quicklisp
CLiKiCLiki: cl-match
Quickdocscl-match | Quickdocs
common-lisp.netcl-match
CL Test Grid: ビルド状況cl-match | CL Test Grid

インストール方法

(ql:quickload :cl-match)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 READMEにいきなり、

================================================================================
================================================================================
NOTE: SUPERSEDED BY OPTIMA, https://github.com/m2ym/optima.
================================================================================
================================================================================

とあるのですが、これはオリジナルにはないのでメンテナの人が付けたものでしょうか。
どういう経緯なのか不明ですが、なんだか微妙です(オリジナルの作者は承知の上なのか)。

 それはさておき中身ですが、match、ifmatch、letmatch、defpattern位でシンプルです。
matchが汎用で多分岐のもの、ifmatchは、2分岐、letmatchは、ifmatchに近いですが、マッチしなければエラー、defpatternでパタンに名前が付けられます。
パタンにはガードを付けることが可能で:whenで指定します。

(cl-match:ifmatch (:list a b (:list c)) '(a 1 (2))
  (list b c)
  :fail)
;=>  (1 2)

(cl-match:ifmatch (:when (and (numberp b) (numberp c)) (:list a b (:list c))) '(a 1 (2)) (list b c) :fail) ;=> (1 2)

(cl-match:ifmatch (:when (and (numberp b) (numberp c)) (:list a b (:list c))) '(a b (c)) (list b c) :fail) ;=> :FAIL

(cl-match:letmatch (:when (and (numberp b) (numberp c)) (:list a b (:list c))) '(a 1 (2)) (list b c)) ;=> (1 2)

(cl-match:match '(+ 1 2) ((:when (and (numberp M) (numberp N)) (:list '+ M N)) (+ M N)) ((:when (and (numberp M) (numberp N)) (:list '* M N)) (* M N))) ;=> 3

(cl-match:defpattern mypat (a b c) `(:when (and (numberp ,b) (numberp ,c)) (:list ,a b (:list c))))

(cl-match:match '(a 1 (2)) ((mypat a b c) (list a b c))) ;=> (A 1 2)

まとめ

 今回は、cl-matchを紹介してみました。
件の移行勧告は時期的にConsolidating Common Lisp Librariesという働き掛けが発端なのかなと思います。2年経過してこの働き掛け自体忘れられつつある感がありますが、実際のところどうなんでしょう。
ちなみに、cl-matchの性能は以前にベンチを取ってみたことがありますが、特に悪いという訳でもありません(遅くてもoptimaの倍位)。

 仮に競合する5つのライブラリがあったとして1本に絞ったは良いがその選ばれた1本がメンテナンスされなくなったら、一体どうなるのかなと思うことはあります。
現状のCommon Lispのライブラリを眺める限りでは、質が良くても作者の都合で放棄されることが多いですが、こっちの方がどうにか改善されて欲しいですね。

comments powered by Disqus