next up previous
Next: 1.4 n番目のデータを得る Up: 1 リスト処理関数の定義 Previous: 1.2 eqとequal

1.3 リストデータも比較したい場合

上のmemberの定義であれば, (member '(2) '((1) (3) (2) (4) (5))) は,nilになってしまいます.そこで,eqをequalに置き換えて定義すれば,

> (member '(2) '((1) (3) (2) (4) (5)))
((2) (4) (5))
となる.場合によって判定関数を変えたい場合に,

(defun member (item l &key (test #'eq))
  (cond
   ((null l) nil)
   ((funcall test item (car l)) l)
   (t (member item (cdr l) :test test))))
という具合に,keyword引数をつけた形で定義して,
> (member '(a) '((b) (a) (c)))
NIL 
> (member '(a) '((b) (a) (c)) :test #'equal)
((A) (C)) 
> (member 'a '((b) (a) (c)) :key #'car)
((A) (C))


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