#types #lisp #common-lisp
#типы #lisp #common-lisp
Вопрос:
Я невероятно новичок в программировании на LISP, и я пытаюсь написать этот предварительный фрагмент кода для чтения слов из файла в параметр, затем распечатать все слова из этого списка, чтобы убедиться, что все слова были вставлены в него. Это то, что у меня есть на данный момент:
(defparameter *wordlist* nil)
(defun run()
(get-words-from-file)
(print-wordlist *wordlist*))
(defun get-words-from-file ()
(let ((in (open "/Users/levibanks/Desktop/cs352/program3/wordlist.txt")))
(dotimes (n 500)
(setq *wordlist* (append (read-line in))))
(close in)))
(defun print-wordlist (wordlist)
(when wordlist
(print (car wordlist))
(print-wordlist (cdr wordlist))))
Однако, когда я пытаюсь запустить этот код, он выдает мне ошибку «Значение ‘brown’ [слово в файле, из которого я считываю] не относится к ожидаемому списку типов».
Я действительно не уверен, почему это не должно работать, поскольку я видел распечатанные списки таким образом раньше, так что любая помощь была бы очень признательна!
Ответ №1:
Вам следует прочитать о
В частности, (setq a (append b))
ничего не добавляет к предыдущему значению a
.
Что вам нужно, так это
(defun read-lines-from-file (file-name)
(with-open-file (input file-name)
(loop for line = (read-line input nil nil)
while line collect line)))
(defparameter *wordlist* (read-lines-from-file "/Users/levibanks/Desktop/cs352/program3/wordlist.txt"((
Комментарии:
1. Спасибо за помощь! После публикации этого я понял, что неправильно использовал append, потому что (А) слово, которое я считывал из файла, не считалось списком, и (Б) я не указывал в append два параметра (а именно, список слов и строку чтения).
2.
(defun get-words-from-file () (let ((in (open "/Users/levibanks/Desktop/cs352/program3/wordlist.txt"))) (dotimes (n 500) (setq *wordlist* (append *wordlist* (list (read-line in))))) (close in)))