X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fstream.lisp;h=086b145d81a69e245dc8d7bf4d9ebf24e12366c9;hb=50599fbc81fc665124ebb66ad01be4166df23b0e;hp=bd72cf903e9ca045ae8f4d1faaa57c8e6d3babac;hpb=faff7941ef38373e7df4f041ced16e95271a476e;p=jscl.git diff --git a/src/stream.lisp b/src/stream.lisp index bd72cf9..086b145 100644 --- a/src/stream.lisp +++ b/src/stream.lisp @@ -19,27 +19,39 @@ ;;; TODO: Use structures to represent streams, but we would need ;;; inheritance. -(defvar *standard-output*) +(/debug "loading stream.lisp!") + +(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)))