Common lisp 公共Lisp从文件读取并存储为列表

Common lisp 公共Lisp从文件读取并存储为列表,common-lisp,sbcl,Common Lisp,Sbcl,所以做一些常见的lisp练习,一切都进行得很顺利,直到我遇到这种奇怪的行为。我将文本从文件(brown.txt)读入一个变量语料库,它应该存储为一个列表。然而,我怀疑它不是,即使它有时工作起来像一个,但在其他时候失败了 以下是基本的读取文件->列表附加->将列表存储在语料库中(拆分/标记为空白): 下面是两个表达式,它们都应该起作用,但只有后者起作用(语料库一)。第一个返回零 (loop for token in *corpus* do (print token)) *corpus*

所以做一些常见的lisp练习,一切都进行得很顺利,直到我遇到这种奇怪的行为。我将文本从文件(brown.txt)读入一个变量语料库,它应该存储为一个列表。然而,我怀疑它不是,即使它有时工作起来像一个,但在其他时候失败了

以下是基本的读取文件->列表附加->将列表存储在语料库中(拆分/标记为空白):

下面是两个表达式,它们都应该起作用,但只有后者起作用(语料库一)。第一个返回零

(loop for token in *corpus* do
     (print token))
*corpus*
我怀疑它与作为流对象从文件中读取有关,(append…)不会从该流创建列表,而是延迟等待,直到我想稍后对其进行求值或sumth,然后它才决定不再工作??(对我来说没什么意义)。

这个表达:

(loop for token in *corpus* do
     (print token))

返回
NIL
,因为它没有
RETURN
子句或累加子句(例如
COLLECT
APPEND
)。它只是重复调用
PRINT
,但放弃其返回值。

标准的公共Lisp函数都不是惰性函数。
APPEND
无法辨别列表的来源,也不关心列表的来源。列表就是列表。
LOOP
返回
NIL
,除非它有
RETURN
语句或使用一个集合动词。为什么期望第一个表达式返回某些内容?它会打印列表元素作为副作用,但不会返回它们。@Barmar-Hmm,但我认为循环的除非关键字上的collect将意味着它在完成时返回一个列表(直到满足时)是,
TOKENIZE
返回一个列表。但是您的
(令牌循环…
表达式中没有
COLLECT
,因此它不会返回任何内容。
(loop for token in *corpus* do
     (print token))