Возврат списка слов из файла - PullRequest
3 голосов
/ 08 ноября 2010

Мой следующий проект - написание игры палач.Я подумал, что это поможет мне разобраться со строками и файловым вводом / выводом.

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

(defun read-word-list ()
  "Returns a list of words read in from a file."
  (let ((word-list (make-array 0 
                 :adjustable t
                 :fill-pointer 0)))
       (with-open-file (stream #p"wordlist.txt")
     (loop for line = (read-line stream)
        while line
          (push line word-list)))
       (select-target-word word-list)))))

Ответы [ 2 ]

5 голосов
/ 08 ноября 2010

Вы можете читать слова как символы Lisp, используя всего несколько строк кода:

(defun read-words (file-name)
    (with-open-file (stream file-name)
      (loop while (peek-char nil stream nil nil)
           collect (read stream))))

Пример входного файла - words.txt:

attack attempt attention attraction authority automatic awake 
bright broken brother brown brush bucket building 
comfort committee common company comparison competition

Чтениеfile:

> (read-words "words.txt")
=> (ATTACK ATTEMPT ATTENTION ATTRACTION AUTHORITY AUTOMATIC AWAKE BRIGHT BROKEN BROTHER BROWN BRUSH BUCKET BUILDING COMFORT COMMITTEE COMMON COMPANY COMPARISON COMPETITION)

Можно сохранить регистр, заключив символы в трубы (|) или объявив их как строки:

|attack| "attempt" ...

Считывание без потери регистра:

> (read-words "words.txt")
=> (|attack| "attempt" ...)
2 голосов
/ 08 ноября 2010

Если слова по одному в строке, вы можете сделать что-то вроде этого:

(defun file-words (file)
  (with-open-file (stream file)
    (loop for word = (read-line stream nil)
          while word collect word)))

Затем вы можете использовать его так:

(file-words "/usr/share/dict/words")
...