Чтобы объединить последовательности в строку, используйте concatenate 'string
.
(defun concat-strings (list)
(apply #'concatenate 'string list))
Чтобы удалить из списка все, что не является строкой, используйте remove-if-not
.
(defun concat-strings (list)
(apply #'concatenate 'string
(remove-if-not #'stringp list)))
Если аргумент не является списком, об ошибке будет сообщено remove-if-not
. Конечно, вы можете добавить утверждение до того, чтобы выдать более конкретное сообщение об ошибке, но оно не добавляет здесь значения.
(defun concat-strings (list)
(assert (listp list)
"This is not a list: ~s." list)
(apply #'concatenate 'string
(remove-if-not #'stringp list)))
EDIT:
Как отмечает Райнер, apply
работает только со списками ограниченной длины. Если у вас нет оснований полагать, что ваш список не может быть длиннее call-arguments-limit
минус один, лучше использовать форму reduce
:
(defun concat-strings (list)
(reduce (lambda (a b)
(concatenate 'string a b))
(remove-if-not #'stringp list)))