Сравнить введенный шаблон и строку (сопоставление с образцом) - Lisp
Формулировка задачи:
Написать функцию с двумя переменными, первая - шаблон, вторая - строка. Шаблон состоит из символа: * заменят любой символ в количестве от 0 до N, символ ? заменят только один любой символ. К примеру при введение шаблона Л**М?Н и строки ЛИМОН, они будут друг другу соответствовать.
Решение задачи: «Сравнить введенный шаблон и строку (сопоставление с образцом)»
textual
Листинг программы
(defun shablon (a b) (shablon1 (explode a) (explode b))) (defun shablon1 (a b) (cond ((null a) (null b)) ((null b) nil) ((eq (car a) '*) (or (shablon1 (cdr a) b) (cond ((null b) nil) (t (shablon1 a (cdr b)))) )) ((eq (car a) '?) (shablon1 (cdr a) (cdr b))) ((eq (car a) (car b)) (shablon1 (cdr a) (cdr b))) (t nil) )) (shablon "Л**М?Н" "ЛИМОН") ==> T (shablon "?" "") ==> NIL
Объяснение кода листинга программы
В коде определена функция shablon
, которая принимает два аргумента a
и b
. Внутри функции происходит вызов shablon1
, в которую передаются результаты вызова explode
для аргументов a
и b
.
Функция shablon1
реализована с помощью функции cond
, которая проверяет следующие условия:
- Если
a
иb
равныnil
, то возвращаетсяnil
. - Если
a
равен*
, то выполняется рекурсивный вызовshablon1
дляcdr a
иb
, и результат илиится с помощью функцииor
. - Если
a
равен?
, то выполняется рекурсивный вызовshablon1
дляcdr a
иcdr b
. - Если
a
иb
равны друг другу, то возвращаетсяnil
. - Если не выполнено ни одно из вышеперечисленных условий, то возвращается
nil
. В основной части кода вызывается функцияshablon
с аргументамиЛ**М?Н
иЛИМОН
. Результатом выполнения являетсяT
, что означает, что шаблон соответствует строке. В следующем вызове функцииshablon
с аргументами?
и```, результатом выполнения является
nil`, что означает, что шаблон не соответствует строке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д