Определить функцию, которая возвращает копию этой строки - Lisp

Узнай цену своей работы

Формулировка задачи:

Дана строка текста. Определить функцию, которая возвращает копию этой строки, в которой все знаки препинания кроме последнего заменены на вопросительный знак. Последний знак препинания остаётся без изменения. Например: если дано "Привет, Мир! Вот и я!", ответом будет "Привет? Мир? Вот и я!".

Решение задачи: «Определить функцию, которая возвращает копию этой строки»

textual
Листинг программы
(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. Наконец, новая строка возвращается в качестве результата.

Оцени полезность:

14   голосов , оценка 4.143 из 5
Похожие ответы