(in-package "CL-USER")
(defun string-reverse (string)
(declare (type simple-string string)
(optimize (speed 3)))
(check-type string simple-string)
(loop with len = (length string)
with s = (make-string len)
for i from 0
for j from (1- len) downto 0
do (setf (char s i)
(char string j))
finally (return s)))
(compile 'string-reverse)
(assert (equal "" (string-reverse "")))
(assert (equal "a" (string-reverse "a")))
(assert (equal "ba" (string-reverse "ab")))
(assert (equal "cba" (string-reverse "abc")))
(assert (equal "dcba" (string-reverse "abcd")))
(assert (equal "edcba" (string-reverse "abcde")))
(let ((s "abcdef")) (assert (not (eq s (string-reverse s)))))
(let ((N 1000000)
(input "いろはにほへと"))
(dolist (fn '(STRING-REVERSE
COMMON-LISP:REVERSE))
(time (loop initially (format t "~&~A:~A~%"
(package-name (symbol-package fn))
fn)
with s = (copy-seq input)
for r = (funcall fn s)
repeat N
finally (format t "~S -> ~S~%" input r)))
#+clisp (terpri)
#-sbcl (terpri)))
#+ccl (quit)