2010-12-13 2 views
0

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

(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)))))) 
+0

Вы бы отделили код? Существует кнопка, которая позволяет вставить четыре пробела перед блоком кода, который затем будет показан как предварительно отформатированный блок. – koddo

+0

также: x и y нигде не определены, каковы они? Проверьте синтаксис COND и посмотрите свой код с отступом - соответствует ли он синтаксису? Какова цель функций B и CHECK? Что должен делать Б? Что проверяет CHECK? –

ответ

0

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

(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 
+0

вы также получите кредиты на работу? –

+0

(если ab nil) = (если ab) = (и ab) –

+0

(cond ((...) (t (если ab nil)))) = (cond ((...) (ab))) –

Смежные вопросы