
Лабораторные работы на muLisp / lab_5
.docЛабораторная работа №5
«Обработка строк, работа со списками»
Цель работы: приобретение навыков работы со строками, сложно организованными списками, арифметическими операциями и различными естественно-языковыми конструкциями на языке muLisp.
Задание к работе: задана некоторая строка и список слов произвольного уровня вложенности. Требуется сформировать из исходного списка список строк без вложений, удалив из него все повторяющиеся слова и те, которые содержат заданную строку в качестве подстроки.
Выполнение работы:
Описание функций:
del (obj list) – удаляет из списка list все элементы, в которых входит подстрока obj.
del_all (obj list) – удаляет из списка list все элементы, соответствующие заданному элементу obj.
del_list (list) – удаляет из списка list все повторяющиеся элементы.
del_vlog (list) – удаляет из списка списков list один уровень вложенности.
check_vlog (list) – проверяет наличие вложенных списков в списке list. Если вложений нет, возвращает t, иначе nil.
start_del_vlog (list) – организует удаление вложений в списке list.
start (obj list) – организует удаление повторяющихся элементов в списке list и элементов, в которых встречается подстрока obj.
start2 (obj list) – организует работу программы, в качестве параметров передаются подстрока obj и список слов произвольного уровня вложенности list.
Листинг программы:
; удаление из списка всех слов, в которых встречается заданная подстрока
(defun del (obj list)
((null list) nil)
((findstring obj (car list)) (del obj (cdr list)))
( cons (car list) (del obj (cdr list)))
)
; удаление из списка всех элементов, соответствующих заданному
(defun del_all (obj list)
((null list) nil)
((eql obj (car list)) (del obj (cdr list)))
(cons (car list) (del obj (cdr list)))
)
; организация удаления из списка всех повторяющихся элементов
(defun del_list (list)
((null list) nil)
(setq rez (cons (car list) (del_all (car list) (cdr list))))
(cons (car rez) (del_list (cdr rez)))
)
; удаление одного уровня вложенности списков
(defun del_vlog (list)
((null list) nil)
(setq elem (car list))
((atom elem) (cons (car list) (del_vlog (cdr list))))
(append (car list) (del_vlog (cdr list)))
)
; проверка на наличие вложенности списков
(defun check_vlog (list)
((null list) t)
(( atom (car list)) (check_vlog (cdr list)))
nil
)
; организация удаления вложенности списков
(defun start_del_vlog (list)
((check_vlog list) list)
(start_del_vlog (del_vlog list))
)
; удаление повторяющихся элементов и слов, в которых встречается заданная подстрока
(defun start (obj list)
(setq rez (del obj list))
(setq rez (del_list rez))
)
; организация обработки списка
(defun start2 (obj list)
(setq rez (start_del_vlog list))
(setq rez (start obj rez))
)
Работа программы:
Для начала работы программы необходимо вызвать функцию start2 и передать ей в качестве параметров подстроку и список слов произвольного уровня вложенности:
При нажатии кнопки Enter начинается работа программы и выводится результирующий список, полученный после удаления вложений, повторяющихся элементов и элементов, где встречается заданная подстрока:
Вывод: в ходе выполнения работы были получены навыки работы со строками, сложно организованными списками на языке muLisp. Также были получены навыки создания своих собственных функций, использующих рекурсивную обработку списков.