(defun f (string &optional (step 1) (repeat 1))
  (let ((A  (coerce string 'list))
        (L (length string)))
    (setf A (nconc A A)) ;make a circular list
    (loop for start from 0 upto (1- (* L repeat)) by step
          collect (coerce (subseq A start (+ start L)) 'string))))

(format t "~{~A~%~}~%" (f "Hello, world!"))

(format t "~{~A~%~}~%" (f "foo bar baz." 4))
(format t "~{~A~%~}~%" (f "foo bar baz." 4 4))

(let ((A "プログラミングのお題スレ Part4"))
  (format t "~{~A~%~}~%" (f A))
  (format t "~{~A~%~}~%" (f A (1- (length A)) (1- (length A)))))
