;;; -*- mode: lisp -*- ;;; $Id: strcat.cmucl,v 1.0 2002/05/03 12:06:00 dada Exp $ (defconstant *string* "hello ") (defun string-concat1 (n) (declare (fixnum n)) (let ((str "") (used-len 0) (string-leng 0) (i (1+ n))) (declare (fixnum i used-len string-leng)) (declare (simple-base-string str)) (declare (optimize (speed 3) (debug 0) (safety 0))) (dotimes (i (1- i) (replace (make-string used-len) str)) (let ((required-length (+ used-len (length *string*)))) (if (eq string-leng 0) (setq str (make-string required-length) string-leng required-length) (if (> required-length string-leng) (let ((new-len (+ string-leng string-leng))) (let ((new-str (make-string new-len))) (replace new-str str :end2 used-len) (setq str new-str string-leng new-len))))) (replace str *string* :start1 used-len) (setq used-len required-length))))) (let ((n (parse-integer (or (car pop11::poparglist) "1")))) (format t "~A~%" (length (string-concat1 n))))