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
。在我看来,在这里省略这个论点并没有什么坏处,尽管有时明确地写它会更具可读性。
它可能看起来很简单,但我无法让它工作。我只需要读取一个文件,其中的内容只是一个大列表
(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
。在我看来,在这里省略这个论点并没有什么坏处,尽管有时明确地写它会更具可读性。