scsh-0.5/rts/port.scm

81 lines
2.2 KiB
Scheme

; Copyright (c) 1993, 1994 Richard Kelsey and Jonathan Rees. See file COPYING.
; Current input and output ports.
(define $current-input-port (make-fluid #f))
(define $current-output-port (make-fluid #f))
(define $error-output-port (make-fluid #f))
(define (current-input-port)
(fluid $current-input-port))
(define (current-output-port)
(fluid $current-output-port))
(define (error-output-port)
(fluid $error-output-port))
(define (with-initial-ports in out thunk)
(let-fluids $current-input-port in
$current-output-port out
$error-output-port out
thunk))
; File openers with unwind protection
(define (call-with-mumble-file open close)
(lambda (string proc)
(let ((port #f))
(dynamic-wind (lambda ()
(if port
(warn "throwing back into a call-with-...put-file"
string)
(set! port (open string))))
(lambda () (proc port))
(lambda ()
(if port
(close port)))))))
(define call-with-input-file
(call-with-mumble-file open-input-file close-input-port))
(define call-with-output-file
(call-with-mumble-file open-output-file close-output-port))
;(define (call-with-input-file string proc)
; (let* ((port (open-input-file string))
; (result (proc port)))
; (close-input-port port)
; result))
;
;(define (call-with-output-file string proc)
; (let* ((port (open-output-file string))
; (result (proc port)))
; (close-output-port port)
; result))
(define (with-input-from-file string thunk)
(call-with-input-file string
(lambda (port)
(let-fluid $current-input-port port thunk))))
(define (with-output-to-file string thunk)
(call-with-output-file string
(lambda (port)
(let-fluid $current-output-port port thunk))))
(define (newline . port-option)
(write-char #\newline (output-port-option port-option)))
(define (output-port-option port-option)
(cond ((null? port-option) (current-output-port))
((null? (cdr port-option)) (car port-option))
(else (error "write-mumble: too many arguments" port-option))))
(define (input-port-option port-option)
(cond ((null? port-option) (current-input-port))
((null? (cdr port-option)) (car port-option))
(else (error "read-mumble: too many arguments" port-option))))