(defun stringp (s)
(stringp s))
+(defun string-length (string)
+ (storage-vector-size string))
+
(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))
`(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))))))