2010-12-13 30 views
0

J'ai donné l'assertion d'écrire une fonction dans le lisp commun pour comparer deux listes pour voir si elles sont égales et on m'a interdit d'utiliser le "égal" prédicat je ne peux utiliser que "eq" et je semble venir à un mur. J'obtiens cette erreur avec mon code EVAL: SETF variable n'a pas de valeur Les redémarrages suivants sont disponibles: et il code:Mise en place d'une fonction égale dans le lisp commun en utilisant seulement "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

Voulez-vous indenter votre code? Il y a un bouton qui permet d'insérer quatre espaces avant un bloc de code, qui sera affiché en tant que bloc préformaté alors. – koddo

+0

aussi: x et y ne sont nulle part définis, quels sont-ils? Vérifiez la syntaxe de COND et voyez votre code en retrait - correspond-il à la syntaxe? Quel est le but des fonctions B et CHECK? Que devrait faire B? Que vérifie CHECK? –

Répondre

0

Je suppose que cela est ce que vous cherchez:

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

Tests:

? (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

obtiendrez-vous également les crédits de devoirs? –

+0

(si ab nul) = (si ab) = (et ab) –

+0

(cond ((...) (t (si ab nul)))) = (cond ((...) (ab))) –