возвращая значение в программировании LISP - PullRequest
1 голос
/ 18 октября 2019

У меня есть функция

(defun read-as-list (filename)

    (defparameter parlist(list nil) )
    (let ((in (open filename :if-does-not-exist nil)))
        (when in
            (loop for line = (read-line in nil)
                 while line do
                    (defparameter mylist line)
                    (push mylist (cdr (last parlist)))
                    ;(append parlist (list mylist))
                    ;(print mylist)
                    ;(format t "~a~%" line)
            )
            (close in)
        )
    )
    (print parlist)
    (return-from read-as-list parlist)
)

, которая просто берет имя файла и считывает его во вложенный список и возвращает список

Я вызываю его в функции down, например:

(defun test_on_test_data ()
    (print "....................................................")
    (print "Testing ....")
    (print "....................................................")

    (let (con (read-as-list "document1.txt"))
        (print con)
    )   
)

(test_on_test_data)

в функции test-on-test-data, con печатает nil, и она не вызывает функцию read-as-list

вместо печати содержимого файлов в виде списка, который она печатает nil.

Может кто-нибудь, пожалуйста, помогите мне в этом.

1 Ответ

1 голос
/ 18 октября 2019

Вот пример функции, которую вы можете использовать, чтобы проверить, как перебирать строки в файле. Он принимает указатель пути и функцию обратного вызова и выполняет эту функцию для всех строк в файле. Функция должна принимать один параметр - читаемую строку.

(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 в цикле. Вы получите список всех строк.

...