next up previous
Next: 11 関数をデータとして扱う関数の例 Up: ソフトウェア第三 講義資料 Lisp, リスト処理,集合 Previous: 9.10 find-all

10 例題: データベース検索例

個人データを (名前 性別 身長 年齢 学校名) のようにリストで表現し、そのリストを集めたリストを データベースとして、ある条件を満たす個人データを 集める手続きを考えよう。
(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日