common lisp:将列表读入列表

common lisp: read list into list

它可能看起来很简单,但我无法让它工作。我只需要读取一个文件,其中的内容只是一个大列表

(a b c d)

。 . .原样。 . .进入我程序中的列表。我有

(let ((ardplst nil))     
...
(with-open-file (in ardpfile :direction :input :if-does-not-exist nil)
    (when in
      (read-sequence ardplst in))      
        (format t "~a" ardplst))

但它不起作用。我得到零。我做错了什么?

来自流的 read-sequence do? It reads some elements 是什么,通常是 个字符 (但这取决于流的元素类型)并将它们破坏性地插入到输入序列中。所以,你会收集字符#\(,然后是#\a,然后是#\Space,然后是#\b,等等。然而,阅读停止为一旦你到达你的序列的末尾:你的空列表,这意味着 立即 (你应该传递一个缓冲区,例如一个向量)。在你的情况下,read-sequence returns 0.

你得到nil的原因是因为你的最后一个表达式是format,它在上面的代码中输出到标准输出(因为t)和returns nil。您可以使用 print,其中 returns 打印对象。

我不明白你为什么要明确使用 :if-does-not-exist nil。如果文件无法打开,您确定要静默跳过该任务吗?如果您阅读的列表是空的怎么办?如果找不到文件,您可能应该发出错误信号。

我会在禁用读取时评估时使用 read

(with-open-file (in my-file)
   (let* ((*read-eval* nil)
          (list (read in)))
     (prog1 list
       (check-type list list))))

注意默认的:direction:input。在我看来,在这里省略这个论点并没有什么坏处,尽管有时明确地写它会更具可读性。