LISP: значение не относится к списку ожидаемых типов

#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)))