Настройка одинаковой функции в общем lisp с использованием только «eq» - PullRequest
0 голосов
/ 13 декабря 2010

Я дал задание написать функцию в общем lisp, чтобы сравнить два списка, чтобы увидеть, равны ли они, и я обнажился от использования «равного» предиката, я могу использовать только «eq», и я, кажется, пришел к стене. Я получаю эту ошибку с моим кодом EVAL: переменная SETF не имеет значения Доступны следующие перезапуски: и он код:

(defun check(L1 L2)
  (cond
   ((eq L nil) nil)
   (setq x (first L1))
   (setq y (first L2))
   (setf L1 (rest L1))
   (setf L2 (rest L2))
   (if (eq x y) (check L1 L2))))

(defun b(L1 L2)
  (cond
   ((eq L1 nil) nil)
   (setf x (first L1))
   (setf y (first L2))
   (setf L1 (rest L1))
   (setf L2 (rest L2))
   (if (and (list x) (list y)
           (check(x y))
            (if (eq x y) (b(L1 L2))))))

1 Ответ

0 голосов
/ 13 декабря 2010

Я думаю, это то, что вы ищете:

(defun compare-lists (list1 list2)
  (if (and (not (null list1)) 
           (not (null list2)))
      (let ((a (car list1)) (b (car list2)))
        (cond ((and (listp a) (listp b))
               (and (compare-lists a b)
                    (compare-lists (cdr list1) (cdr list2))))
              (t 
               (and (eq a b)
                    (compare-lists (cdr list1) (cdr list2))))))
      (= (length list1) (length list2))))

Тесты:

? (compare-lists '(1 2 3) '(1 2 3))
T
? (compare-lists '(1 2 3) '(1 2 3 4))
NIL
? (compare-lists '(1 2 3) '(1 2 (3)))
NIL
? (compare-lists '(1 2 (3)) '(1 2 (3)))
T
? (compare-lists '(1 2 (a b c r)) '(1 2 (a b c (r))))
NIL
? (compare-lists '(1 2 (a b c (r))) '(1 2 (a b c (r))))
T
...