X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fstring.lisp;h=411c638be89569d6e9c3e2eeeab4423800761f2b;hb=b2de12c4e1a6e77e7f3f22d056adcfeda79d085b;hp=1bb322b84f6f6e4847d566a386fb2d1e5e57e467;hpb=928c6f695253c9f03ff440d18338efb8eea9b2f0;p=jscl.git diff --git a/src/string.lisp b/src/string.lisp index 1bb322b..411c638 100644 --- a/src/string.lisp +++ b/src/string.lisp @@ -22,6 +22,10 @@ (defun make-string (n &key initial-element) (make-array n :element-type 'character :initial-element initial-element)) +(defun char (string index) + (unless (stringp string) (error "~S is not a string" string)) + (storage-vector-ref string index)) + (defun string (x) (cond ((stringp x) x) ((symbolp x) (symbol-name x)) @@ -57,15 +61,19 @@ `(aset ,g!string ,g!index ,g!value) `(char ,g!string ,g!index)))) -(defun concatenate-two (string1 string2) - (let* ((len1 (length string1)) - (len2 (length string2)) - (string (make-array (+ len1 len2) :element-type 'character)) - (i 0)) - (dotimes (j len1) - (aset string i (char string1 j)) - (incf i)) - (dotimes (j len2) - (aset string i (char string2 j)) - (incf i)) - string)) + +(defun concat (&rest strs) + (flet ((concat-two (str1 str2) + (concatenate-storage-vector str1 str2))) + (!reduce #'concat-two strs ""))) + + +(defun string-upcase (string) + (let ((new (make-string (length string)))) + (dotimes (i (length string) new) + (aset new i (char-upcase (char string i)))))) + +(defun string-downcase (string) + (let ((new (make-string (length string)))) + (dotimes (i (length string) new) + (aset new i (char-downcase (char string i))))))