LISP 使用循环比较两个列表

LISP compare two lists using a loop

我正在编写一个简单的函数来循环遍历一对列表,并且 return 每个元素的 true 或 false 是否有一个符号是 F。

这是一长串函数的末尾,输入如下所示:

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

这是目前的样子。

    (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 语句。 它指出我试图获取不是 listp 的成功 cdr。

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

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)