LISP / Nyquist открывает файл и читает построчно - PullRequest
0 голосов
/ 21 января 2012

Я изо всех сил пытаюсь открыть файл и читать каждую строку до EOF. Я использую nyquist, который основан на XLISP и не имеет Common Lisp's 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

UPDATE:

Используя информацию и ссылку, предоставленные Райнером Йосвигом, я смог найти типичный код, который можно использовать для открытия файла и чтения его построчно:

  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 - переменные, назначенные для использования в цикле, их начальные значения и способы их приращения. В этом случае fp и ex. fp не увеличивается, а ex инициализируется и увеличивается на один read от fp (я понятия не имею, для чего этот трейлинг nil)
  2. строка 3 - условие выхода для цикла и список return expressions, все из которых оцениваются при выходе, и последний из которых возвращается. В этом случае произойдет выход, когда ex == null и затем nil будет возвращено
  3. строка 4 - фактическое тело цикла. Самоочевиден в этом случае.

примечание: do* отличается от do тем, что позволяет использовать переменные, назначенные в одном выражении, в более позднем, например, как fp используется в присваивании ex

Я всего n00b на любом LISP, поэтому, если что-то из перечисленного неверно, пожалуйста, говорите.

1 Ответ

3 голосов
/ 21 января 2012

Nyquist не основан на Common Lisp. Он основан на ранней XLISP. Он поддерживает только простой LOOP, а не сложный LOOP Common Lisp.

См. Руководство Nyquist:

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

Синтаксис LOOP:

(loop expr...)

Он не поддерживает расширенный синтаксис LOOP Common Lisp.

...