3

这是我的文件和功能:

List1.txt => 猫狗虎熊

List2.txt => 猫狗老虎

这些文件在 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*)

我认为输出只是“熊”。但是,它返回 ("cat", "dog", "tiger", "bear") 作为差异。我假设它必须与我从文件中读取信息有关,但我被困在那里。感谢您的时间。

4

2 回答 2

5

Common LispEQL用作默认测试。你想要string-equal的或类似的。

CL-USER > (set-difference '("cat" "dog" "tiger" "bear")
                          '("cat" "dog" "tiger")
                          :test #'string-equal)
->
("bear")
于 2013-04-11T14:45:15.800 回答
1

除了 Rainer 已经提到的:test关键字参数之外set-difference,您的代码中还有另一个问题。您的函数get-file返回一个行列表,其中每一行只是一个字符串。您可能希望将这些行拆分为单词。您可以使用split-sequence函数轻松完成(谷歌获取split-sequenceCommon Lisp 包或使用

(ql:quickload :split-sequence)

如果你安装了quicklisp。因此,您的函数可能如下所示:

(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")
于 2013-04-11T15:12:07.987 回答