LISP / Nyquist打开文件并逐行阅读

时间:2012-01-20 21:44:22

标签: lisp audacity nyquist

我正在努力打开一个文件,并读取每一行直到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未递增,ex已初始化并从fp增加一read(我不知道尾随nil是什么)
  2. 第3行 - 循环的退出条件,以及return expressions的列表,所有这些都在退出时进行评估,并返回最后一个。在这种情况下,当ex == null然后nil将被返回
  3. 时将退出
  4. 第4行 - 循环的实际主体。在这种情况下可以自我解释。
  5. 注意:do*do的不同之处在于它允许在一个表达式中分配的变量在后一个表达式中使用,例如fp在{{1}的赋值中的使用方式}}

    我在任何一种LISP中总计n00b,所以如果上述任何一种错误,请说出来。

1 个答案:

答案 0 :(得分:3)

奈奎斯特不是基于Common Lisp。它基于早期的XLISP。它只支持简单的LOOP,而不支持Common Lisp的复杂LOOP。

参见奈奎斯特手册:

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

其LOOP语法为:

(loop expr...)

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