#:g1: track-bestの紹介

Posted 2014-06-04 08:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の155日目です。

track-bestとはなにか

 track-bestは、Patrick Stein氏作の最大値を扱うためのユーティリティです。

パッケージ情報

パッケージ名track-best
Quicklisp
CLiKihttp://cliki.net/track-best
Quickdocshttp://quickdocs.org/track-best
CL Test Grid: ビルド状況track-best | CL Test Grid

インストール方法

(ql:quickload :track-best)

試してみる

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

 簡単な使い方としては、こんな感じ

(*:shuffle (*:iota 100))
;=>  (67 36 91 70 28 42 41 9 84 33 49 95 77 26 24 74 53 66 76 31 52 22 13 1 38 58 20
;     92 83 2 90 30 19 47 97 59 4 23 37 18 15 61 64 62 10 73 3 96 99 44 89 54 71 5
;     98 63 6 57 68 21 25 85 81 75 86 79 45 32 56 50 78 65 87 40 72 94 88 34 60 69 7
;     29 11 93 16 48 43 35 14 17 82 27 39 46 51 80 8 55 12 0)

(let ((ns (*:shuffle (*:iota 100)))) (track-best:with-track-best () (dolist (n ns) (track-best:track n n)))) ;=> 99 ; 99

それLOOPでもできるよ、

(loop :for n :in (*:shuffle (*:iota 100)) :maximize n)
;=>  99

というところなのですが、収集する値が複数になると割合に面倒です。

(let ((keep 4))
  (loop :with ans := (make-array keep :initial-element *:single-float-negative-infinity)
        :with last := (1- keep)
        :for n :in (*:shuffle (*:iota 100))
        :do (sort ans #'>=)
        :when (>= n (aref ans last)) 
          :do (setf (aref ans last) n)
        :finally (return ans)))
;=>  #(99 98 97 96)

track-bestなら簡単に記述できます

(let ((ns (*:shuffle (*:iota 100))))
  (track-best:with-track-best (:keep 4)
    (dolist (n ns)
      (track-best:track n n))))
;=>  (99 98 97 96)
;    (99 98 97 96)

他にも色々オプションがあるのでテストケースやドキュメントを参照のこと。

まとめ

 今回は、track-bestを紹介してみました。
たまに使いたいことがありそうです。

comments powered by Disqus