Next: 11 関数をデータとして扱う関数の例
Up: ソフトウェア第三 講義資料 Lisp, リスト処理,集合
Previous: 9.10 find-all
個人データを
(名前 性別 身長 年齢 学校名)
のようにリストで表現し、そのリストを集めたリストを
データベースとして、ある条件を満たす個人データを
集める手続きを考えよう。
(setq data
'((arisa f 120 7 higashi)
(hiroshi m 145 12 minami)
(yuki f 140 11 higashi)
(masaki m 100 5 - )
(toshi m 110 6 nishi)
(misa f 120 8 minami)
))
たとえば、男子のデータリストを返す関数は、
> (remove-if-not (is 'm) data :key #'cadr)
((HIROSHI M 145 12 MINAMI) (MASAKI M 100 5 -)
(TOSHI M 110 6 NISHI))
となることから、
(defun find-male (d)
(remove-if-not (is 'm) d :key #'cadr))
とすればよい。
次に、ある小学校の子供のリストデータを返す関数は、引数として、その小学校名
をとるようにするには、
(defun find-students-of (school d)
(remove-if-not (is school) d
:key #'(lambda (x) (elt x 4))))
身長が120cm以上の子供全体のデータリストを返す関数は、
>(defun find-taller-than-120 (d)
(remove-if-not #'(lambda (x) (> x 120)) d
:key #'(lambda (x) (elt x 2))))
find-taller-than-120
> (find-taller-than-120 data)
((HIROSHI M 145 12 MINAMI) (YUKI F 140 11 HIGASHI))
ある年齢以上の男の子を探す関数は、
> (defun find-male-older-than (d age)
(remove-if-not (is 'm)
(remove-if-not #'(lambda (x) (> x age)) d
:key #'(lambda (x) (elt x 3)))
:key #'(lambda (x) (elt x 1))))
find-male-older-than
> (find-male-older-than data 10)
((HIROSHI M 145 12 MINAMI))
という具合に定義できる。
generated through LaTeX2HTML. M.Inaba 平成18年5月7日