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日