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

时间:2014-09-03 19:12:55

标签: common-lisp sbcl

所以做一些常见的lisp练习,一切顺利,直到我遇到这种奇怪的行为。我将文件(brown.txt)中的文本读入变量 corpus ,并且它应该存储为列表。但是,我怀疑它不是,即使它有时像一个一样,但在其他时候失败。

以下是从文件中读取的基本内容 - >附加清单 - >在语料库中存储列表(在空格上拆分/标记化):

(defun tokenize (string)
  (loop
     for start = 0 then (+ space 1)
     for space = (position #\space string :start start)
     for token = (subseq string start space)
     unless (string= token "") collect token
     until (not space)))

(defparameter *corpus*
   (with-open-file (stream "./brown.txt" :direction :input)
     (loop for line = (read-line stream nil)
           while line
           append (tokenize line))))

下面是2个表达式应该都可以工作,但只有后者才能工作(语料库一个)。第一个返回NIL。

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

我怀疑它与从文件中读取 stream 对象有关,并且(append ...)不会从此流创建列表,而是懒惰等待直到我想要稍后评估或加以评估,在那之后它只是决定不再工作了? (对我来说没什么意义)。

1 个答案:

答案 0 :(得分:8)

这个表达式:

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

返回NIL,因为它没有RETURN子句或累积子句(例如COLLECTAPPEND)。它只是反复调用PRINT,但会丢弃其返回值。