Работа с файлами в 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)))))))

Объяснение кода листинга программы

В коде присутствуют четыре функции, которые работают со списками (символические переменные представлены в виде строк):

  1. cw - функция для подсчета количества вхождений слова в список.
  2. rmw - функция для удаления слова из списка.
  3. countw - функция для подсчета количества слов в списке.
  4. loadd - функция для чтения списка из потока. Вот что делает каждая функция:
  5. cw принимает три аргумента: s (исходный список), w (слово для подсчета) и n (начальное значение счетчика).
  6. rmw принимает два аргумента: s (исходный список) и w (слово для удаления).
  7. countw принимает один аргумент: s (исходный список).
  8. loadd принимает один аргумент: stream (поток для чтения). Список слов в каждой функции выделяется символом '(). Значения переменных, таких как s, w и n, передаются в функции как аргументы и обычно являются строками.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.455 из 5