2012-05-05 4 views
0

Я портирую некоторые из моих сценариев python на Common Lisp. Мне нужно получить список файлов в каком-то каталоге и распечатать содержимое каждого файла по строкам. Этот код показывает мне все имена файлов. Но строки печатаются только для последнего файла. Зачем? Кроме того, что является лучшим способом для итерации файловыми линиями? Спасибо.Получить файлы в каталоге, распечатать по строкам

(dolist (file (directory (make-pathname :name :wild 
             :type :wild 
             :defaults "path\\to\\files\\"))) 
    (print file) 
    (with-open-file (stream file) 
    (do ((line (read-line stream) (read-line stream))) 
     (nil t) 
     (print line)))) 
+0

Я думаю, что это конец тест-форма, это возврат к нулю. –

+0

NIL всегда неверно. Он петляет вечно. Это то, что вы хотели? –

ответ

1

Я бы предложил написать функцию, которая печатает файл с указанием пути и потока.

Вы итерации с DO. Это нормально, но я бы использовал что-то вроде LOOP, что позволяет немного легче читать код.

Ваш DO - бесконечный цикл. Возможно, вы захотите закончить цикл, когда EOF будет достигнут.

READ-LINE генерирует сообщение об ошибке, когда оно считывается за конец файла. Таким образом, ваш код сигнализирует об ошибке в конце первого файла. Эта ошибка заставляет ваш код печатать только первый файл.

Вам необходимо позвонить READ-LINE таким образом, чтобы вы проверили EOF и затем закончили итерацию. См. Аргументы READ-LINE. В качестве альтернативы вы можете поймать ошибку EOF, но другое решение немного проще.

0

Это, кажется, работает для меня:

(dolist (file (directory (make-pathname :name :wild 
              :defaults "/tmp/lt/files/"))) 
    (print file) 
    (with-open-file (stream file) 
     (do ((line (read-line stream nil) (read-line stream nil))) 
     ((null line)) 
     (print line)))) 
+0

Спасибо, этот код работает! –