Kamuycikap - SentenceDataBase

日々の勉強の記録を気分で書き綴るブログ

Emacs Lisp: 等しいリスト

Emacs Lisp: 等しいリスト

リストとリストを比べて同じかどうか調べる関数を定義してみる。
リストの要素は全てシンボルか整数であることと、2つのリストのそれぞれの要素がeqで比較するとtになることと考えます。

(defun equiv (x y)
  (cond
   ((and (null x) (null y)) t)
   ((or (null x) (null y)) nil)
   (t (and (eq (car x) (car y))
           (equiv (cdr x) (cdr y))))))

(equiv '(1 t dog) '(1 t rabbit))  ;; => nil

equivが終了するのはxとyのどちらかがnilになるとき。
条件式(and (null x) (null y))は、xとyの両方がnilであるかどうか調べているのですが、これは引数の2つが同じ長さかどうかを調べています。

条件式(or (null x) (null y)) nil)はどちらか一方がnilであるかどうかを調べています。
そもそもリストの長さが異なる場合は等しくないのでnilを返します。

最終的な条件式(tに行くのは、少なくともxとyにひとつ以上の要素が入っている場合です。
このばあい、xとyが等しくなるのは

  1. xのcar要素とyのcar要素が等しい
  2. xのcdr要素とyのcdr要素が等しい

の両方の条件を満たした時になります。

リストのネストには対応していないので、、、、後日にでも対応したものを作ってみよう。