(defun join-string2 (string-list &key (join-by " ") (convert-to-string nil)) (declare (ignorable convert-to-string)) (let ((length-1 (1- (length string-list)))) (with-output-to-string (s) (if (= length-1 0) (princ (first string-list) s) (progn (dolist (word (subseq string-list 0 length-1)) (princ word s) (princ join-by s)) (princ (nth length-1 string-list) s))) s))) CL-USER> (join-string2 (list "a") :join-by "_") "a" CL-USER> (join-string2 (list "a" "b" "c") :join-by "_") "a_b_c"