Определить функцию, которая возвращает копию этой строки - Lisp
Формулировка задачи:
Решение задачи: «Определить функцию, которая возвращает копию этой строки»
(defun punctuation-marks (s p &aux (v '(#\. #\, #\: #\; #\! #\? #\-)) (n (position-if #'(lambda (a) (member a v)) s :from-end t)) (u (subseq s 0 n)) (z (subseq s n))) (concatenate 'string (substitute-if p #'(lambda (a) (member a v)) u) z)) > (punctuation-marks "abra: ca, dabra!" #\?) "abra? ca? dabra!" > (punctuation-marks "abra: ca, da! bra" #\?) "abra? ca? da! bra"
Объяснение кода листинга программы
В этом коде определена функция punctuation-marks, которая принимает три аргумента: строку s, в которой ищется пунктуация, символ p, который указывает, какие знаки препинания нужно найти, и aux, который не используется в этой функции.
Сначала создаются две переменные: v, содержащая список знаков препинания, и n, содержащая позицию первого найденного знака препинания в строке s.
Затем создаются две другие переменные: u, содержащая подстроку s от начала до позиции n, и z, содержащую подстроку s от позиции n до конца.
Далее, с помощью функции concatenate, создается новая строка, в которую вставляются все символы из u, за которыми следует символ p, а затем все символы из z.
Наконец, новая строка возвращается в качестве результата.