Emacs Lisp: 集合
ある対象データがある集合の要素かどうか、つまり、特定のシンボルが、リストの中に含まれているかどうか検出。
集合に含まれていれば「t」、そうでなければ「nil」を返す。
集合はリストで表現する。
関数の第一引数は検査対象となるデータ。
第二引数は集合を表すリスト。
要素であるかどうかは「eq」で比較。
(defun memq (x set) (cond ((null set) nil) ((eq x (car set)) t) (t (memq x (cdr set))))) (memq 'dog '(rat2 pig rat)) ;; => nil
特定のリストがリストの中に含まれているかどうか検出する関数も作ってみる。
(defun subset (set1 set2) (cond ((null set1) t) ((null (memq (car set1) set2)) nil) (t (subset (cdr set1) set2)))) (subset '(3 2 1) '(1 2 3)) ;; => t