This library provided extra IO related procedures.
Calls thunk. During evaluation of thunk, the current input port, current output port, current error port are set to port, respectively.
These utility functions are trivially defined as follows;
(define (call-with-input-string str proc)
(proc (open-input-string str)))
(define (call-with-output-string proc)
(let ((port (open-output-string)))
(proc port)
(get-output-string port)))
(define (with-input-from-string str thunk)
(with-input-from-port (open-input-string str) thunk))
(define (with-output-to-string thunk)
(let ((port (open-output-string)))
(with-output-to-port port thunk)
(get-output-string port)))
Re-export of buffered-port
and transcoded-port
.
Sagittarius provides means to create user defined ports. One of the ways is using R6RS custom port procedures. The other one is extending custom port class. The followings show how to extend it.
;; example for input port
(import (rnrs) (sagittarius io) (clos user))
;; make a custom binary input port with 'read slot
(get-u8 (make <custom-binary-input-port>
:read (lambda (bv start count)
(bytevector-u8-set! bv start 1)
1)))
;; example for output port
(import (rnrs) (sagittarius io) (clos user))
;; user defined custom binary output port
(define-class <my-port> (<custom-binary-output-port>)
;; this port has own buffer
((buffer :init-form (make-bytevector 5 0))))
;; create the port
(let ((out (make <my-port>)))
;; set 'write slot
(slot-set! out 'write
(lambda (bv start count)
;; just get the first element of given bytevector
;; and set it to own buffer
(bytevector-copy! bv start (slot-ref out 'buffer) 0 count)
count))
;;
(put-bytevector out #vu8(1 2 3 4 5))
(slot-ref out 'buffer))
;; -> #vu8(1 0 0 0 0)
Custom port classes. All of these classes have the following slots:
Identifier of the port. Must be string is specified.
All of them must be either procedure or #f.
position
procedure must accept 0 argument. The procedure should
return the position of the port.
set-position
procedure must accept 2 argument, position_and_whence. Whence shall be a symbol of begin
,
current
or end
. The procedure should set the position
of the port according to the given whence and position.
read
procedure must accept 3 argument. bv or string,
start and count. The first argument is decided by the port
type. If the port is binary port, then bytevector bv is passed.
If the port is textual port, then string string is passed.
The procedure should fill given bv or string in _count_data elements starting start. And return number of data filled.
write
procedure must accept 3 argument. bv or string,
start and count. The first argument is decided by the port
type. If the port is binary port, then bytevector bv is passed.
If the port is textual port, then string string is passed.
The procedure should retrieve data from given bv or _string_upto count data elements starting start. And return number
of data read.
ready
procedure must accept 0 argument. The procedure should
return true value if the port is ready to read. Otherwise #f.
flush
procedure must accept 0 argument. The procedure should
flush the port.
close
procedure must accept 0 argument. The procedure should
close the port.
If the creating port is input port, then read
must be set before
any port operation. If the creating port is output port, then write
must be set before any port operation. Other slots are optional.