2015-03-05 5 views
0

Я пишу простую функцию для цикла через пару списков и вернуть истинным или ложным для каждого элемента, является ли любой из символов F.LISP сравнить два списка с помощью цикла

Это в конец длинной строки функций и ввода будет выглядеть следующим образом:

«(FEEEEFEEFFFFEEEE) » (EFEEEEEEFFFFEEFE)

Вот как это выглядит на данный момент.

(defun finalcalc (tree1 tree2) 
    (loop :for e1 :in tree1 
     :for e2 :in tree2 
     :nconc (if (or (eq e1 'F) 
         (eq e2 'F)) 
        (print 'success)))) 

Я сделал ошибку здесь. Я не уверен, что это мой цикл или мой оператор if. В нем говорится, что я попытался взять cdr успеха, который не является listp.

Может ли кто-нибудь объяснить проблему?

ответ

2

nconc деструктивно объединяет результаты каждой итерации. (print 'success) печатает успех и оценивает успех, который не является списком.

Попробуйте

(defun finalcalc (tree1 tree2) 
    (loop :for e1 :in tree1 
     :for e2 :in tree2 
     :collect (if (or (eq e1 'F) 
         (eq e2 'F)) 
        'success 
        'failure))) 
;; print result 
(mapC#'print (finalcalc '(F E E E E F E E F F F F E E E E) '(E F E E E E E E F F F F E E F E))) 
; ==> (success success failure failure failure success failure failure 
;  success success success success failure failure success failure) 
; (and prints the words in order) 
+0

Спасибо! Была ли моя ошибка просто использованием: nconc? – JT93

+0

@ JT93 Кроме того, у вас нет альтернативы да. ': collect' чаще встречается, если вы хотите создать новый список из цикла. Посмотрите на [Loop for black belt] (http://www.gigamonkeys.com/book/loop-for-black-belts.html) для получения дополнительных примеров. – Sylwester

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