LISP使用循环比较两个列表

时间:2015-03-05 14:16:19

标签: list loops common-lisp

我正在编写一个简单的函数来遍历一对列表,并为每个元素返回一个true或false,以确定其中一个符号是否为F.

这是一长串函数的结尾,输入如下:

'(F E E E E E F F F F E E E) '(E E E E E E F F F F E E F E)

以下是目前的情况。

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

有人可以解释这个问题吗?

1 个答案:

答案 0 :(得分: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)