Как определить функцию для чтения списка слов

Я хочу прочитать файл, который содержит список слов (по одному слову в строке) в список.

(define (read-wordlist myFile)
  (begin 
   (set 'listA '()) 
   (set 'in-file (open myFile "read")) 
   (while (read-line in-file) 
       (set 'listA (append listA (list (current-line))))) 
   (close in-file)))

Эта функция читает файл в список listA

Предполагая, что у меня есть в wordlist.txt

Lemon
Orange
Lime
Mango
Pawpaw
Strawberry
Apple
Watermelon
Banana

я получил

> (read-my-file "wordlist.txt")
true
> listA
 ("Lemon" "Orange" "Lime" "Mango" "Pawpaw" "Strawberry" "Apple" "Watermelon" "Banana")

2 параметра

Теперь я хочу иметь функцию, которая считывает файл в список, где я могу указать имя.

(define (read-wordlist2 myFile myList)
  (begin
    (set myList '())
    (set 'in-file (open myFile "read")) 
      (while (read-line in-file) 
         (set myList (append myList (list (current-line)))))
    (close in-file)))

Однако вызов

 (read-wordlist2 "wordlist.txt" 'myWordList)

выдает ошибку

ERR: array, list or string expected in function append : myWordList
called from user defined function read-my-file2

Как я могу изменить определение read-wordlist2 заставить это работать?

1 ответ

Решение

Вы не цитируете свои списки:

(define (read-wordlist2 myFile myList)
  (begin
    (set 'myList '())
    (set 'in-file (open myFile "read"))
      (while (read-line in-file)
         (set 'myList (append myList (list (current-line)))))
    (close in-file)))

Но также есть, вероятно, гораздо лучшие способы сделать это. read-file здесь полезно extend а также push Есть лучшие способы добавить в списки. А контексты предоставляют словарь и хэш-функции, которые, как правило, быстрее и полезнее.

Чуть более идиоматичным будет:

(define (read-wordlist my-file)
    (let ((in-file  (open my-file "read"))
           my-list '())
      (while (read-line in-file)
          (extend my-list (list (current-line))))
      (close in-file)
      my-list))

(set 'word-list (read-wordlist "/tmp/wordlist.txt"))

Более просто:

(set 'word-list (parse (read-file "/tmp/wordlist.txt") "\n" 0))

Ссылка: разбирать

Другие вопросы по тегам