0

我正在努力打开一个文件,并读取每一行直到 EOF。我正在使用基于 XLISP 的 nyquist,并且缺少 Common Lisp 的with-open-file. 我的代码是:

(let ((in_file (open "/home/soodesune/testfile.csv" :if-does-not-exist nil)))
    (loop for line = (read-line in_file)
         while line do (print line))
    (close in_file))

我从 nyquist 得到的输出是:

error: unbound variable - LINE

我希望得到一些帮助,了解我哪里出错了


注意:我也试过:

(loop for line = (read-line in_file nil)

但这给出了:

error: too many arguments

更新:

使用 Rainer Joswig 提供的信息和链接,我能够找到可以用来打开文件并逐行读取的典型代码:

  1 (do* ((fp (open "test.dat" :direction :input))
  2       (ex (read fp nil) (read fp nil)))
  3  ((null ex) (close fp) nil)
  4  (print ex))

do函数具有三个基本部分:

  1. 第 1 行和第 2 行 - 分配用于循环的变量、它们的初始值以及如何增加它们。在这种情况下fpexfp不递增,并且从 fpex初始化并递增一read(我不知道尾随nil是什么)
  2. 第 3 行 - 循环的退出条件,以及return expressions所有在退出时评估的列表,并返回最后一个。在这种情况下 exit 将发生时ex == null,然后nil将被返回
  3. 第 4 行 - 循环的实际主体。在这种情况下不言自明。

注意:do*不同之处do在于它允许在一个表达式中分配的变量在以后的一个表达式中使用,就像fp在赋值中使用的方式一样ex

在任何类型的 LISP 中,我都是 n00b,所以如果以上任何一个错误,请说出来。

4

1 回答 1

3

Nyquist 不是基于 Common Lisp。它基于早期的 XLISP。它只支持简单的 LOOP,不支持 Common Lisp 的复杂 LOOP。

参见奈奎斯特手册:

http://www.cs.cmu.edu/~rbd/doc/nyquist/part19.html#226

它的 LOOP 语法是:

(loop expr...)

它不支持 Common Lisp 的扩展 LOOP 语法。

于 2012-01-20T22:06:05.090 回答