[Ecls-list] CLOS streams
    Julian St. 
    der_julian at web.de
       
    Thu Jun 26 15:45:12 UTC 2003
    
    
  
Hello,
having the ability to create own streams proves to be really useful for using ECL as a plugin. But I wonder what the right way to this it (especially what methods I have to provide, currently I just grep'ed thorugh the ECL sources to see where ECL_CLOS_STREAMS takes effect). I tried it the following way ( %print is the only function that gets called. It emits a single line and changes to the next ).
The implementation as it is seen below works despite of two issues: 
1) I get the following warnings:
;;; Warning: STREAM-CLOSE is being redefined.
;;; Warning: STREAM-INPUT-P is being redefined.
;;; Warning: STREAM-OUTPUT-P is being redefined.
;;; Warning: STREAM-WRITE-CHAR is being redefined.
;;; Warning: STREAM-FORCE-OUTPUT is being redefined.
;;; Warning: STREAM-CLEAR-OUTPUT is being redefined.
2) I think there too many empty lines written. Looks strange sometimes:
(from terminal)
> (describe 'cons)
...
-----------------------------------------------------------------------
CONS                                                         [Function]
Function in COMMON-LISP package:
...
(from X-Chat with my redirection)
-----------------------------------------------------------------------  CONS 
                                                              [Function] Function in COMMON-LISP package:        
Regards,
Julian
Code follows:
;; Getting *standard-output* redirected to X-Chat.
(defclass xchat-stream
    ()
  ((lbuffer :accessor xchat-stream-buffer
	    :initform (make-array  0 :adjustable t :fill-pointer t
				   :element-type 'character)))
  (:documentation "A stream directed to X-Chat"))
(defmethod stream-close ((stream xchat-stream))
  (error "Cannot close ~S." stream))
(defmethod stream-input-p ((stream xchat-stream))
  nil)
(defmethod stream-output-p ((stream xchat-stream))
  t)
(defmethod stream-flush-buffer ((stream xchat-stream))
  (if (not (zerop (length (xchat-stream-buffer stream)))) ; FIXME: This removes a lot of strange empty lines...
      (%print (xchat-stream-buffer stream)))
  (stream-clear-output stream))
    
(defmethod stream-write-char ((stream xchat-stream) char)
  (if (char= char #\Newline)
      (stream-flush-buffer stream)
      (vector-push-extend char (xchat-stream-buffer stream))))
(defmethod stream-force-output ((stream xchat-stream))
  (stream-flush-buffer stream))
(defmethod stream-clear-output ((stream xchat-stream))
  (setf (xchat-stream-buffer stream) (make-array  0 :adjustable t :fill-pointer t
   						  :element-type 'character)))
(setq *standard-output* (make-instance 'xchat-stream))
-- 
Support strong cryptography.
Key ID     : D65B2AB5 
Fingerprint: FA38 DCD3 00EC 97B8 6DD8  D7CC 35D8 8D0E D65B 2AB5
Key server : pgp.mit.edu
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
URL: <https://mailman.common-lisp.net/pipermail/ecl-devel/attachments/20030626/d0b8132b/attachment.sig>
    
    
More information about the ecl-devel
mailing list