#:g1: fare-matcherの紹介

Posted 2014-02-27 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の59日目です。

fare-matcherとはなにか

 fare-matcherはfare氏作のパタンマッチのライブラリです。作者曰く、

THIS LIBRARY IS BEING DEPRECATED IN FAVOR OF OPTIMA. PLEASE USE OPTIMA INSTEAD.

とのことで、現在はOptima利用推奨のようです。

パッケージ情報

パッケージ名fare-matcher
Quicklisp×
CLiKihttp://cliki.net/fare-matcher

インストール方法

(asdf:load-system :fare-matcher)

試してみる

 作者がOptimaを使えというだけあって、Quicklispからも外れてしまったようです。ちょっと前にQuicklispでインストールすると、length=n-pが無いので動かなかったりしました。(ASDFのuiop/utility:length=n-pを持ってくればOK)

 このままさよならなのかfare-matcherということで記念にベンチを取ってみました。競争相手は高速なtoadstoolです。

(defun h-toad (op a b)
  (toadstool:toad-case op a b
     '+ M N -> (when (and (numberp M) (numberp N))) (+ M N) 
     '+ 0 F -> F
     '+ F 0 -> F
     '+ A (list '+ B C) toadstool:-> (h '+ (h '+ A B) C)
     '* M N -> (when (and (numberp M) (numberp N))) (* M N)
     '* 0 F -> 0
     '* F 0 -> 0
     '* F 1 -> F
     '* 1 F -> F
     '* A (list '* B C) toadstool:-> (h '* (h '* A B) C)
     Op A B -> (list Op A B)))

(defun harropify-toad (x) (toadstool:toad-case x (list Op A B) toadstool:-> (h-toad Op (harropify-toad A) (harropify-toad B)) A toadstool:-> A))

(defun h-fm (op a b) (fare-matcher:match (list op a b) ((list '+ A (list '+ B C)) (h-fm '+ (h-fm '+ A B) C)) ((list '+ (and M (fare-matcher:of-type integer)) (and N (fare-matcher:of-type integer))) (+ M N) ) ((list '+ 0 F) F) ((list '+ F 0) F) ((list '* (and M (fare-matcher:of-type integer)) (and N (fare-matcher:of-type integer))) (* M N)) ((list '* 0 F) 0) ((list '* F 0) 0) ((list '* F 1) F) ((list '* 1 F) F) ((list '* A (list '* B C)) (h-fm '* (h-fm '* A B) C)) ((list Op A B) (list Op A B))))

(defun harropify-fm (x) (fare-matcher:match x ((list Op A B) (h-fm Op (harropify-fm A) (harropify-fm B))) (A A)))

(harropify-toad '(* x (+ (+ (* 12 0) (+ 23 8)) y))) ;=> (* X (+ 31 Y))

(harropify-fm '(* x (+ (+ (* 12 0) (+ 23 8)) y))) ;=> (* X (+ 31 Y))

(dotimes (i (expt 10 7)) (harropify-toad '(* x (+ (+ (* 12 0) (+ 23 8)) y)))) ;=> NIL #|------------------------------------------------------------| Evaluation took: 3.053 seconds of real time 3.044189 seconds of total run time (3.032189 user, 0.012000 system) [ Run times consist of 0.092 seconds GC time, and 2.953 seconds non-GC time. ] 99.71% CPU 7,307,637,444 processor cycles 960,016,720 bytes consed

Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz |------------------------------------------------------------|#

(dotimes (i (expt 10 7)) (harropify-fm '(* x (+ (+ (* 12 0) (+ 23 8)) y)))) ;=> NIL #|------------------------------------------------------------| Evaluation took: 49.109 seconds of real time 48.659041 seconds of total run time (48.379023 user, 0.280018 system) [ Run times consist of 5.357 seconds GC time, and 43.303 seconds non-GC time. ] 99.08% CPU 117,566,159,256 processor cycles 34,240,014,864 bytes consed

Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz |------------------------------------------------------------|#

toadstoolが16倍位速いですね。

fare-matcherの紹介/関連記事等

 すっかり忘れてましたが、5年前にも紹介記事を書いていたことがfare-matcher関係のものをググっていて発覚しました。

まとめ

 今回は、fare-matcherを紹介してみました。
fare-matcherを使おうという人は、作者の意向を汲んでOptimaを使いましょう。

comments powered by Disqus