("compat" :host)
("utils" :both)
("list" :target)
+ ("string" :target)
("print" :target)
("package" :target)
("read" :both)
(incf pos))
pos))
-(defun string (x)
- (cond ((stringp x) x)
- ((symbolp x) (symbol-name x))
- (t (char-to-string x))))
-
-(defun string= (s1 s2)
- (let ((n (length s1)))
- (when (= (length s2) n)
- (dotimes (i n t)
- (unless (char= (char s1 i) (char s2 i))
- (return-from string= nil))))))
-
(defun equal (x y)
(cond
((eql x y) t)
(defun error (fmt &rest args)
(%throw (apply #'format nil fmt args)))
+
(js!selfcall
"var v = globalEval(xstring(" string "));" *newline*
"return values.apply(this, forcemv(v));" *newline*)
- (code "globalEval(xstring(" string ")")))
+ (code "globalEval(xstring(" string "))")))
(define-builtin %throw (string)
(js!selfcall "throw " string ";" *newline*))
(code "((" object ")[xstring(" key ")] = " value ")"))
(define-builtin in (key object)
- (js!bool (code "(xstring(" key ") in (" object ")")))
+ (js!bool (code "(xstring(" key ") in (" object "))")))
(define-builtin functionp (x)
(js!bool (code "(typeof " x " == 'function')")))
--- /dev/null
+;;; string.lisp
+
+;; JSCL is free software: you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation, either version 3 of the
+;; License, or (at your option) any later version.
+;;
+;; JSCL is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with JSCL. If not, see <http://www.gnu.org/licenses/>.
+
+(defun string (x)
+ (cond ((stringp x) x)
+ ((symbolp x) (symbol-name x))
+ (t (char-to-string x))))
+
+(defun string= (s1 s2)
+ (let ((n (length s1)))
+ (when (= (length s2) n)
+ (dotimes (i n t)
+ (unless (char= (char s1 i) (char s2 i))
+ (return-from string= nil))))))
+
+(define-setf-expander char (string index)
+ (let ((g!string (gensym))
+ (g!index (gensym))
+ (g!value (gensym)))
+ (list (list g!string g!index)
+ (list string index)
+ (list g!value)
+ `(aset ,g!string ,g!index ,g!value)
+ `(char ,g!string ,g!index))))
;; You should have received a copy of the GNU General Public License
;; along with JSCL. If not, see <http://www.gnu.org/licenses/>.
-(defvar *newline* (string (code-char 10)))
+(defvar *newline* "
+")
(defmacro concatf (variable &body form)
`(setq ,variable (concat ,variable (progn ,@form))))
--- /dev/null
+(defvar *str* "hello world")
+(defvar *str2* "h")
+
+(test (stringp *str*))
+(test (not (characterp *str*)))
+(test (not (integerp *str*)))
+
+(test (stringp *str2*))
+(test (not (characterp *str2*)))
+(test (not (integerp *str2*)))
+
+(test (= (length "hello world") 11))
+(test (arrayp "hello world"))
+
+(test (string= "h" (string #\h)))
+(test (string= "foo" "foo"))
+(test (not (string= "Foo" "foo")))
+(test (not (string= "foo" "foox")))