Написать функцию с двумя переменными. Первая - собственно, шаблон, вторая - строка для проверки соответствия - Lisp
Формулировка задачи:
Задание: сопоставление введенного шаблона и строки
Нужно написать функцию с двумя переменными. первая - собственно, шаблон, вторая - строка для проверки соответствия.
Шаблон строится по следующим правилам:
символ * заменят любой символ в количестве от 0 до n
символ ? заменят только один любой символ
количество * и ? в шаблоне неограничено
Например, при введенном шаблоне L?*S**P строка LISP будет ему соответствовать
Пожалуйста, если есть идеи, подскажите!
Решение задачи: «Написать функцию с двумя переменными. Первая - собственно, шаблон, вторая - строка для проверки соответствия»
textual
Листинг программы
- (defun mems (s p)
- (member (car s) (cdr p) :test #'equal))
- (defun check (p s)
- (cond ((null s) t)
- ((or (equal (car p) (car s))
- (equal (car p) "?"))
- (check (cdr p) (cdr s)))
- ((when (equal (car p) "*")
- (if (mems s p)
- (if (equal (car s) (cadr s))
- (check (cdr (mems s p)) (cddr s))
- (check (cdr (mems s p)) (cdr s)))
- (check p (cdr s)))))))
- (defun squeeze (p &optional z)
- (when p (if (equal (car p) "*")
- (if z
- (squeeze (cdr p) z)
- (cons "*" (squeeze (cdr p) t)))
- (cons (car p) (squeeze (cdr p) nil)))))
- (defun cleave (s)
- (map 'list #'string s))
- (defun concord (p s)
- (when (> (length s) 0) (check (squeeze (cleave p)) (cleave s))))
- > (concord "L?*S**P" "LISP")
- T
- > (concord "L?*S**P" "LCISP")
- T
- > (concord "L?*S**P" "LISRP")
- T
- > (concord "L?*S**P" "LLISP")
- T
- > (concord "L?*S**P" "LISPP")
- T
- > (concord "L?*S**P" "CLISP")
- NIL
- > (concord "L?*S**P" "LISPC")
- NIL
- > (concord "L?*S**P" "")
- NIL
Объяснение кода листинга программы
В этом коде представлено несколько функций для работы со строками в языке программирования, возможно, Lisp. Они выполняют следующие действия:
- Функция
mems
ищет все вхождения первого аргумента (шаблона) во втором аргументе (строке для проверки). - Функция
check
проверяет, соответствует ли первый аргумент (шаблон) второму аргументу (строке для проверки). Если шаблон равен*
, то функция рекурсивно вызывается для оставшейся части строки. Если шаблон равен?
, то функция возвращаетnil
. Если шаблон равен*
, то функция проверяет, содержит ли строка символ?
. Если да, то функция возвращаетnil
. Если нет, то функция вызывается рекурсивно для оставшейся части строки. Если шаблон равен пустой строке, то функция возвращаетnil
. - Функция
squeeze
удаляет все вхождения символа*
из строки. Если второй аргумент (опциональный) равенnil
, то возвращается исходная строка без изменений. Если второй аргумент (опциональный) не равенnil
, то он добавляется в начало результата. - Функция
cleave
разбивает строку на список символов. - Функция
concord
проверяет, соответствует ли первый аргумент (шаблон) второму аргументу (строке для проверки). Если шаблон равен*
, то функция вызывается рекурсивно для оставшейся части строки. Если шаблон равен?
, то функция возвращаетnil
. Если шаблон равен*
, то функция проверяет, содержит ли строка символ?
. Если да, то функция возвращаетnil
. Если нет, то функция вызывается рекурсивно для оставшейся части строки. Если шаблон равен пустой строке, то функция возвращаетnil
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д