by shigemk2

当面は技術的なことしか書かない

対話によるCommon Lisp入門 43 member改 occur

普通のmember関数だと、

'((sio noodle) (miso noodle))

みたいなリストにmember関数を利用してもNILが返る。

[1]> (member 'miso '((sio noodle) (miso noodle)))
NIL

そのため、今回は二重回帰を使う。
今回は変数名にlstではなくtreeを使う。
たとえば(a (b c) d)といったリストがあったとして、
lstは(b c)を考慮せず、(a b c)みたいな感じで扱う。
treeは(b c)も1つのリストとして見做す。

で、(b c)みたいなリストにぶつかったとき、
(b c)の中身も調べるようにする関数を作る。
このとき、(b c)はリストでもいいし、アトムでもいい。

[2]> (defun occur (item tree)
(if (atom tree) (eql item tree)
(if (occur item (first tree)) t
(occur item (rest tree)))))
OCCUR
[3]> (occur 'miso '((sio noodle) (miso noodle)))
T