next up previous
Next: 11.4 関数を返す関数の例:is Up: 11 関数をデータとして扱う関数の例 Previous: 11.2 Map関数


11.3 :test, :keyキーワード

データを順に処理してゆく場合に,個々のデータの関係する場所を取り出して くる手続き(key)と,そのデータの条件を示すための述語(test)を与えられる ようにすることで,同じ関数名の使い方が CommonLispの組み込み関数には,:test や:keyなどが用意されているものが多くあります. 例として,memberがあります.
<cl> (member '(a) '((b) (a) (c)))
NIL 
<cl> (member '(a) '((b) (a) (c)) :test #'equal)
((A) (C)) 
<cl> (member 'a '((b) (a) (c)) :key #'car)
((A) (C))
このようにデフォルトではequalではなくeqlという関数で比較を行ないます. :testで比較関数を指定することでリスト構造の比較も可能となります. また,:keyでcarを指定することで各要素の内部の要素について比較すること ができています. このようなキーワード引数をもつ関数を定義する例として以下のremove-ifを 示しておきます.これは,第一引数の述語がなりたつデータを除くという手続 きです.
(defun remove-if (pred data &key (key #'identity))
  (cond
   ((atom data) nil)
   ((funcall pred (funcall key (car data)))
    (remove-if pred (cdr data) :key key))
   (t (cons (car data)
            (remove-if pred (cdr data) :key key)))))
<cl> (remove-if 'numberp '(a b 1 2 c d))
(a b c d)
<cl> (remove-if #'(lambda (x) (eq 0 (mod x 2)))
                 '(1 2 3 4 5 6))
(1 3 5)
<cl> (evenp 10)
t
<cl> (evenp 11)
nil
<cl> (remove-if #'evenp '((1) (2) (3)) :key #'car)
((1) (3))


generated through LaTeX2HTML. M.Inaba 平成18年5月7日