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