Для одноуровневого списка строк сформировать итоговую строку сцеплением всех элементов списка - Lisp
Формулировка задачи:
Определить функцию, которая для одноуровневого списка строк формирует итоговую строку сцеплением всех элементов списка. Элементы в итоговой строке разделены знаком : двоеточие.
Решение задачи: «Для одноуровневого списка строк сформировать итоговую строку сцеплением всех элементов списка»
textual
Листинг программы
(defun join-with-delimiter (strings delimiter) (check-type strings (satisfies list-of-strings-p)) (check-type delimiter character) (if (endp strings) "" (let ((total-length (1- (loop for string in strings sum (1+ (length string)))))) (check-type total-length fixnum) (locally (declare (optimize (speed 3) (safety 0))) (let ((result (make-string total-length)) (first-string (the string (first strings)))) (setf (subseq result 0) first-string) (loop for start fixnum = (length first-string) then (+ start (length string) 1) for string string in (rest strings) do (setf (char result start) delimiter) (loop for i fixnum from (1+ start) for c character across string do (setf (schar result i) c)) finally (return result)))))))
Объяснение кода листинга программы
В данном коде определен функционал для объединения элементов списка строк в одну строку с заданным разделителем.
- Проверка типов аргументов функции:
- Проверка, что список строк является списком (satisfies list-of-strings-p).
- Проверка, что разделитель является символом (satisfies character).
- Если список пустой, то возвращается пустая строка.
- Если список не пустой, то:
- Вычисляется общая длина итоговой строки как сумма длин всех строк в списке.
- Проверяется, что общая длина является целым числом (satisfies fixnum).
- В локальной области видимости:
- Создается строка нужной длины.
- Первая строка списка копируется в начало результирующей строки.
- Для каждой строки в списке, начиная со второй:
- В результирующую строку добавляется разделитель.
- Все символы строки добавляются в результирующую строку.
- Возвращается итоговая строка.