LISP/Nyquist открывает файл и читает построчно
Я изо всех сил пытаюсь открыть файл и читать каждую строку до 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
ОБНОВИТЬ:
Используя информацию и ссылку, предоставленные Райнером Йосвигом, я смог найти типичный код, который можно использовать, чтобы открыть файл и прочитать его построчно:
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 и 2 - переменные, назначенные для использования в цикле, их начальные значения и способы их приращения. В этом случае
fp
а такжеex
,fp
не увеличивается, иex
инициализируется и увеличивается на одинread
от из фп (я понятия не имею, что это трейлингnil
для) - строка 3 - условие выхода из цикла и список
return expressions
все из которых оцениваются при выходе, и последний из которых возвращается. В этом случае выход произойдет, когдаex == null
а потомnil
будет возвращен - строка 4 - фактическое тело цикла. Самоочевиден в этом случае.
нота: do*
отличается от do
тем, что позволяет использовать переменные, назначенные в одном выражении, в более позднем, например, как fp
используется в назначении ex
Я всего лишь n00b на любом LISP, так что, если что-то из перечисленного неверно, пожалуйста, говорите.
1 ответ
Nyquist не основан на Common Lisp. Он основан на ранней XLISP. Он поддерживает только простой LOOP, а не комплексный LOOP Common Lisp.
Смотрите руководство Nyquist:
http://www.cs.cmu.edu/~rbd/doc/nyquist/part19.html
Синтаксис LOOP:
(loop expr...)
Он не поддерживает расширенный синтаксис LOOP Common Lisp.