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