Работа с файлами в Lisp - Lisp (229488)
Формулировка задачи:
Здравствуйте,
изучаю lisp на начальной стадии, новая лабораторная об обработке обычных текстовых файлов. Никак не могу найти нормальную литературу, где нормально с примерами бы описывалась работа с файлами в лисп. Сама задача: дан текстовый файл, посчитать количество вхождений каждого слова и вывести в виде списка. Например текст:
"Good day
Today is a good day
Monday is a good day"
Т.е. каждое предложение начинается с новой строки. Вывод должен быть: ((good 3)(day 3)(today 1)(is 2)(a 1)(monday 1))
Обязательное условие - функция должна быть написана без встроенных функций, с использованием рекурсии и без использования глобальных переменных...
Очень буду благодарна, если подскажете как считывать строку в виде списка, или считывать каждое слово по отдельности... Ну и если у кого-то завалялась готовая программка и не жалко поделиться, желательно с комментариями спасибо!
Решение задачи: «Работа с файлами в Lisp»
textual
Листинг программы
- (defun cw (s w n)
- "Count the word w in the list s using the initial count n."
- (cond ((null s) (list w n))
- ((equal (car s) w) (cw (cdr s) w (1+ n)))
- (t (cw (cdr s) w n))))
- (defun rmw (s w)
- "Remove the word w from the list s."
- (cond ((null s) nil)
- ((equal (car s) w) (rmw (cdr s) w))
- (t (cons (car s) (rmw (cdr s) w)))))
- (defun countw (s)
- "Count the words in the list s."
- (cond ((null s) nil)
- ((< (car (cdr (cw s (car s) 0))) 2) (countw (rmw s (car s))))
- (t (cons (cw s (car s) 0) (countw (rmw s (car s)))))))
- (defun loadd (stream)
- "Generate the list of words from the stream."
- (let ((c (read-char stream nil)))
- (cond ((null c) nil)
- ((eql c #\Space) (cons '() (loadd stream)))
- ((eql c #\Newline) (cons '() (loadd stream)))
- (t (let ((loaded (loadd stream)))
- (cons (cons c (car loaded)) (cdr loaded)))))))
Объяснение кода листинга программы
В коде присутствуют четыре функции, которые работают со списками (символические переменные представлены в виде строк):
- cw - функция для подсчета количества вхождений слова в список.
- rmw - функция для удаления слова из списка.
- countw - функция для подсчета количества слов в списке.
- loadd - функция для чтения списка из потока. Вот что делает каждая функция:
- cw принимает три аргумента: s (исходный список), w (слово для подсчета) и n (начальное значение счетчика).
- rmw принимает два аргумента: s (исходный список) и w (слово для удаления).
- countw принимает один аргумент: s (исходный список).
- loadd принимает один аргумент: stream (поток для чтения). Список слов в каждой функции выделяется символом '(). Значения переменных, таких как s, w и n, передаются в функции как аргументы и обычно являются строками.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д