Вот пример функции, которую вы можете использовать, чтобы проверить, как перебирать строки в файле. Он принимает указатель пути и функцию обратного вызова и выполняет эту функцию для всех строк в файле. Функция должна принимать один параметр - читаемую строку.
(defun maplines (function path)
(with-open-file (in path)
(loop for line = (read-line in nil nil)
while line
do (funcall function line))))
Обратите внимание, как код отступается, и как при открытии и закрытии файла обрабатывается with-open-file
. Кроме того, внутри тела функции нет defparameter
, так как эта форма используется для объявления глобальных переменных. Нет необходимости использовать return, поскольку последнее значение в теле функции автоматически является значением вызова функции.
Затем вы можете, например, вызвать его следующим образом:
(maplines #'print "/tmp/test.data")
В отличие от вашего кода, если файл не существует, будет сообщено об ошибке. В вашем случае вы молча игнорировали ошибки, передав nil
и ничего не делая с нулевым потоком.
Наконец, все, что вам нужно, - это использовать функцию, которая хранит строки, которые читаются. Или, если вы еще не знаете, как это сделать, измените приведенный выше фрагмент кода, чтобы удалить вызов funcall, и используйте collect
в цикле. Вы получите список всех строк.