Comparison 为什么可以';设置差异功能是否将列表与文件中的数据进行比较?

Comparison 为什么可以';设置差异功能是否将列表与文件中的数据进行比较?,comparison,format,lisp,common-lisp,set-difference,Comparison,Format,Lisp,Common Lisp,Set Difference,以下是我的文件和功能: List1.txt=>cat 狗 老虎 忍受 List2.txt=>cat 狗 老虎 这些文件是在winodws xp上进行ANSI编码的 (defun get-file (filename) (with-open-file (stream filename) (loop for line = (read-line stream nil) while line collect line))) (defparameter *file1* (get-file "

以下是我的文件和功能:

List1.txt=>cat 狗 老虎 忍受

List2.txt=>cat 狗 老虎

这些文件是在winodws xp上进行ANSI编码的

(defun get-file (filename)
  (with-open-file (stream filename)
  (loop for line = (read-line stream nil)
  while line collect line)))

(defparameter *file1* (get-file "list1.txt"))
(defparameter *file2* (get-file "list2.txt"))

(set-difference *file1* *file2*)

我认为输出将只是“熊”。但是,它返回(“猫”、“狗”、“老虎”、“熊”)作为差异。我想这是因为我从文件中读取了信息,但我被卡在那里了。谢谢你抽出时间

公共Lisp使用
EQL
作为默认测试。您希望字符串等于或类似

CL-USER > (set-difference '("cat" "dog" "tiger" "bear")
                          '("cat" "dog" "tiger")
                          :test #'string-equal)
->
("bear")

除了Rainer已经提到的
:test
关键字参数之外,代码中还有另一个问题。函数
get file
返回一个行列表,其中每行仅为一个字符串。你可能想把这些行分成几个字。使用
split sequence
函数(谷歌搜索
split sequence
Common Lisp软件包或使用

(ql:quickload :split-sequence)
如果您已安装。因此,您的函数可能如下所示,例如:

(defun get-file (path)
  (with-open-file (s path)
    (let* ((len (file-length s))
           (data (make-string len)))
      (read-sequence data s)
      (mapcar #'(lambda (string) (string-trim '(#\Space #\Tab #\Newline) string))
        (split-sequence:split-sequence '#\Space data :remove-empty-subseqs t)))))


(defparameter *file1* (get-file "list1.txt"))
(defparameter *file2* (get-file "list2.txt"))

(format t "~s~%" (set-difference *file1* *file2* :test #'string-equal))
这将正确地打印:

("bear")

谢谢,这很有趣。我每行只做一个单词,但这将允许我做我最初想要做的事情。没问题。实际上,您最好使用
cl-ppcre
(split“\\s+”数据)
而不是
split sequence
。谢谢,我尝试了test命令,但使用了“:test#equal”而不是“字符串相等”。非常感谢您的帮助和时间。