;; You should have received a copy of the GNU General Public License
;; along with JSCL. If not, see <http://www.gnu.org/licenses/>.
+(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))
- (t (char-to-string x))))
+ (t (make-string 1 :initial-element x))))
(defun string= (s1 s2)
- (let ((n (length s1)))
+ (let* ((s1 (string s1))
+ (s2 (string s2))
+ (n (length s1)))
(when (= (length s2) n)
(dotimes (i n t)
(unless (char= (char s1 i) (char s2 i))
(when (and (= i (1- len-1)) (> len-2 len-1))
(return-from string< (1+ i))))))))
-(defun stringp (s)
- (stringp s))
-
(define-setf-expander char (string index)
(let ((g!string (gensym))
(g!index (gensym))
(list g!value)
`(aset ,g!string ,g!index ,g!value)
`(char ,g!string ,g!index))))
+
+
+(defun concat-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)
+ (!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))))))