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

标签 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 被初始化并递增了一个 read 从 fp (我不知道尾随 nil 是什么 是为了)
  2. 第 3 行 - 循环的退出条件,以及 return expressions 的列表,所有这些都在退出时进行评估,最后一个被返回。在这种情况下,当 ex == null 时将发生退出,然后将返回 nil
  3. 第 4 行 - 循环的实际主体。在这种情况下不言自明。

注意:do*do 的不同之处在于,它允许在一个表达式中分配的变量在后面的表达式中使用,例如 fp 用于ex

的赋值

我对任何一种 LISP 都一窍不通,所以如果以上有任何错误,请说出来。

最佳答案

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

参见奈奎斯特手册:

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

它的循环语法是:

(loop expr...)

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

关于LISP/Nyquist 打开文件并逐行读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8948237/

相关文章:

syntax-error - 为什么返回错误 'Cannot read property ' car' of undefined [ ]' 即使我有空列表的回退?

audio - 相同的mp3文件在iPhone应用程序中的行为有所不同

audio - 使用相位产生正弦波

audio - 在Audacity中为链式店添加白噪声

lisp - lisp 中的 CDR 使用

numbers - 将字符转换为数字

lisp - 在结构的构造函数中指定多个选项?

ios - objective-c 中的音频文件格式问题

audio - 在Ubuntu上使用ffmpeg,如何记录来自音视频USB捕获设备的音视频?

c - sndfile.h中的sf_count_t类型在libsndfile中是怎么定义的?