Сравнить введенный шаблон и строку (сопоставление с образцом) - 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`, что означает, что шаблон не соответствует строке.