【问题标题】:common lisp: read list into listcommon lisp:将列表读入列表
【发布时间】:2015-10-28 17:54:28
【问题描述】:

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

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

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

【问题讨论】:

  • :if-does-not-exist nil 向我建议 ardpfile 并不是指您的意图。您是否使用了完整路径?
  • 不是这样的。完整路径也会出现同样的错误。

标签: common-lisp


【解决方案1】:

read-sequence 是做什么的?它从流中读取一些elements,通常是characters(但它取决于流的元素类型)并将它们破坏性地插入到输入序列中。所以,你会收集字符#\(,然后是#\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。在我看来,在这里省略这个论点并没有什么坏处,尽管有时明确地写出来会更易读。

【讨论】:

  • 感谢您的解释,但代码似乎不起作用。 Parens 问题和(check-type list list) 给出问题。 (list (read in)) 在做什么?
  • @147pm 对不起,我这里直接修改了代码,没有测试。正如您可能已经猜到的那样,(list (read in)) 是一个绑定:变量 list 保存从流中读取的表单。
  • @147pm 现在应该没事了,我该睡觉了;-)
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2014-11-10
  • 2013-05-16
  • 2011-03-31
相关资源
最近更新 更多