#:g1: filterの紹介

Posted 2014-08-12 05:45:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の224日目です。

filterとはなにか

 filterは、Scott McIntire氏作のリストでのツリー表現を扱うライブラリです。

パッケージ情報

パッケージ名filter
Quicklisp×
配布サイト(archive.org)Allegro CL Examples and Utilities

インストール方法

 Franzのサイトからダウンロードできたりするのですが、しばらく落ちたままなので、archive.orgを紹介しておきます。

試してみる

 用意されているユーティリティは、

といったところです。
動作は下記のような感じですが、filterの動作がSchemeのfilterの動作とは正反対で述語が真を返すものは取り除きます。
flattenは点対リストも処理できるので良いですね(割と対応してなかったりします。)
linearizeというのが謎ですが、flattenしてremove-duplicateするようなものです。

(fil:flatten '((0 . 100) (1 . 101) (2 . 102) (3 . 103) (4 . 104) (5 . 105) (6 . 106)
               (7 . 107) (8 . 108) (9 . 109)))
;=>  (0 100 1 101 2 102 3 103 4 104 5 105 6 106 7 107 8 108 9 109)

(fil:filter '(0 100 1 101 2 102 3 103 4 104 5 105 6 106 7 107 8 108 9 109) #'evenp) ;=> (1 101 3 103 5 105 7 107 9 109)

(fil:linearize '((0 . 9) (1 . 8) (2 . 7) (3 . 6) (4 . 5) (5 . 4) (6 . 3) (7 . 2) (8 . 1) (9 . 0))) ;=> (5 4 6 3 7 2 8 1 9 0)

(fil:linearize '((0 . 9) (1 . 8) (2 . 7) (3 . 6) (4 . 5) (5 . 4) (6 . 3) (7 . 2) (8 . 1) (9 . 0)) :from-end T) ;=> (0 9 1 8 2 7 3 6 4 5)

(fil:prune-tree '((0 9) (1 8) (2 7) (3 6) (4 5) (5 4) (6 3) (7 2) (8 1) (9 0)) #'evenp) ;=> ((9) (1) (7) (3) (5) (5) (3) (7) (1) (9))

(funcall (fil:tree-hom #'evenp (lambda (x) (+ 100 x))) '((0 9) (1 8) (2 7) (3 6) (4 5) (5 4) (6 3) (7 2) (8 1) (9 0))) ;=> ((109) (101) (107) (103) (105) (105) (103) (107) (101) (109))

(fil:tree-sig '(-10 (((((-8 9) ((-7 -5) 9)) ((-10 (2 2)) 3)) -2) ((-2 (5 (((6 -8) (8 (-1 -8))) 2))) (((((6 (3 9)) (9 6)) (1 0)) -3) ((((-2 (-8 (7 0))) 0) (1 -7)) (((-6 (-2 -10)) -10) (-3 (1 ((-6 -2) -9)))))))))) ;=> (T ; (((((T T) ((T T) T)) ((T (T T)) T)) T) ; ((T (T (((T T) (T (T T))) T))) ; (((((T (T T)) (T T)) (T T)) T) ; ((((T (T (T T))) T) (T T)) (((T (T T)) T) (T (T ((T T) T)))))))))

まとめ

 今回は、filterを紹介してみました。
このライブラリもコンパイルを通すのに型宣言を結構調整しないといけませんでした。
まあちょっと直せば動くんですが、古いコードや処理系べったりのコードでコンパイルを通すには、まず型宣言を全部削る所からスタートすると楽だったりしますね。

comments powered by Disqus