Как определить функцию для чтения списка слов
Я хочу прочитать файл, который содержит список слов (по одному слову в строке) в список.
(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))
Ссылка: разбирать