Для одноуровневого списка строк сформировать итоговую строку сцеплением всех элементов списка - 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)))))))

Объяснение кода листинга программы

В данном коде определен функционал для объединения элементов списка строк в одну строку с заданным разделителем.

  1. Проверка типов аргументов функции:
    • Проверка, что список строк является списком (satisfies list-of-strings-p).
    • Проверка, что разделитель является символом (satisfies character).
  2. Если список пустой, то возвращается пустая строка.
  3. Если список не пустой, то:
    • Вычисляется общая длина итоговой строки как сумма длин всех строк в списке.
    • Проверяется, что общая длина является целым числом (satisfies fixnum).
  4. В локальной области видимости:
    • Создается строка нужной длины.
    • Первая строка списка копируется в начало результирующей строки.
  5. Для каждой строки в списке, начиная со второй:
    • В результирующую строку добавляется разделитель.
    • Все символы строки добавляются в результирующую строку.
  6. Возвращается итоговая строка.

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

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