2015-10-28 53 views
2

看起来很简单,但我无法使其工作。我只需要阅读一个文件,其内容只是一个大列表通用lisp:将列表读入列表

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

但它不工作。我得到零。我究竟做错了什么?

+0

':if-does-not-exist nil''暗示我'ardpfile'没有提到你的意图。你使用了完整的路径吗? –

+0

不是这样。完整路径只会得到相同的错误。 – 147pm

回答

4

read-sequence是做什么用的?它从流中读取一些elements,通常是字符(但它取决于流的元素类型)并破坏性地将它们插入到输入序列中。所以,你将收集的字符#\(,然后#\a,然后#\Space,然后#\b然而,读数你到达序列的末尾就停止:用空列表,这意味着立即(你应该通过一个缓冲区,例如一个矢量)。在你的情况下,read-sequence返回0

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

我不明白你为什么明确地使用: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。在我看来,在这里省略这个论点并不会让人伤心,但有时候它可以更明确地写出来。

+0

感谢您的解释,但代码似乎不工作。 Parens问题和'(check-type list list)'给出问题。什么是'(list(read in))'在做什么? – 147pm

+0

@ 147pm对不起,我在这里直接修改了代码而未经测试。正如你可能已经猜到更新后的版本一样,'(list(read in))'是一个绑定:变量'list'包含从流中读取的表单。 – coredump

+0

无法让您的代码正常工作。 – 147pm