write-string and write-char work with streams
authorDavid Vázquez <davazp@gmail.com>
Thu, 20 Jun 2013 13:47:59 +0000 (15:47 +0200)
committerDavid Vázquez <davazp@gmail.com>
Thu, 20 Jun 2013 13:47:59 +0000 (15:47 +0200)
jscl.html
src/compiler.lisp
src/stream.lisp

index e130ef9..ade16ec 100644 (file)
--- a/jscl.html
+++ b/jscl.html
@@ -66,8 +66,9 @@
     <script src="jquery.js" type="text/javascript" charset="utf-8"></script>
     <script src="jqconsole.min.js" type="text/javascript" charset="utf-8"></script>
     <script>
+      var jqconsole;
       $(function () {
-        var jqconsole = $('#console').jqconsole('Welcome to JSCL!\n\n', '');
+        jqconsole = $('#console').jqconsole('Welcome to JSCL!\n\n', '');
         jqconsole.RegisterMatching('(', ')', 'parents');
         if (localStorage.getItem("jqhist"))
            jqconsole.SetHistory(JSON.parse(localStorage.getItem("jqhist")));
index 22b318f..66a734c 100644 (file)
 (define-builtin functionp (x)
   (js!bool (code "(typeof " x " == 'function')")))
 
-(define-builtin write-string (x)
+(define-builtin %write-string (x)
   (code "lisp.write(" x ")"))
 
 
index bd72cf9..b563338 100644 (file)
 ;;; TODO: Use structures to represent streams, but we would need
 ;;; inheritance.
 
-(defvar *standard-output*)
+(defvar *standard-output*
+  (vector 'stream
+          (lambda (ch) (%write-string (string ch)))
+          (lambda (string) (%write-string string))))
 
 (defun streamp (x)
   (and (vectorp x) (eq (aref x 0) 'stream)))
 
+(defun write-char (char &optional (stream *standard-output*))
+  (funcall (aref stream 1) char))
+
+(defun write-string (string &optional (stream *standard-output*))
+  (funcall (aref stream 2) string))
+
+
 (defun make-string-output-stream ()
   (let ((buffer (make-string 0)))
     (vector 'stream
             ;; write-char
             (lambda (ch)
               (vector-push-extend ch buffer))
+            (lambda (string)
+              (dotimes (i (length string))
+                (vector-push-extend (aref string i) buffer)))
             'string-stream
             buffer)))
 
 (defun get-output-stream-string (stream)
-  (eq (aref stream 2) 'string-stream)
-  (prog1 (aref stream 3)
-    (aset stream 3 (make-string 0))))
-
-(defun write-char (char &optional (stream *standard-output*))
-  (funcall (aref stream 1) char))
+  (eq (aref stream 3) 'string-stream)
+  (prog1 (aref stream 4)
+    (aset stream 4 (make-string 0))))
 
 (defmacro with-output-to-string ((var) &body body)
   `(let ((,var (make-string-output-stream)))