mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-11 06:20:23 +02:00
Make (ice-9 buffered-input) more general
This commit is contained in:
parent
97d0e20b2e
commit
451d273ac9
2 changed files with 44 additions and 17 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
2001-03-10 Neil Jerram <neil@ossau.uklinux.net>
|
||||||
|
|
||||||
|
* buffered-input.scm (make-buffered-input-port): New, more general
|
||||||
|
buffered input procedure. Does not assume that a newline
|
||||||
|
character should be interpolated between chunks of input returned
|
||||||
|
by the reader proc.
|
||||||
|
(make-line-buffered-input-port): Redefine in terms of
|
||||||
|
make-buffered-input-port.
|
||||||
|
|
||||||
2001-03-09 Keisuke Nishida <kxn30@po.cwru.edu>
|
2001-03-09 Keisuke Nishida <kxn30@po.cwru.edu>
|
||||||
|
|
||||||
* match.scm: Don't export defstruct. Use (unquote defstruct) instead.
|
* match.scm: Don't export defstruct. Use (unquote defstruct) instead.
|
||||||
|
|
|
@ -18,7 +18,8 @@
|
||||||
;;;; Boston, MA 02111-1307 USA
|
;;;; Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
(define-module (ice-9 buffered-input)
|
(define-module (ice-9 buffered-input)
|
||||||
#:export (make-line-buffered-input-port
|
#:export (make-buffered-input-port
|
||||||
|
make-line-buffered-input-port
|
||||||
set-buffered-input-continuation?!))
|
set-buffered-input-continuation?!))
|
||||||
|
|
||||||
;; @code{buffered-input-continuation?} is a property of the ports
|
;; @code{buffered-input-continuation?} is a property of the ports
|
||||||
|
@ -29,20 +30,18 @@
|
||||||
(define (set-buffered-input-continuation?! port val)
|
(define (set-buffered-input-continuation?! port val)
|
||||||
"Set the read continuation flag for @var{port} to @var{val}.
|
"Set the read continuation flag for @var{port} to @var{val}.
|
||||||
|
|
||||||
See @code{make-line-buffered-input-port} for the meaning and use of
|
See @code{make-buffered-input-port} for the meaning and use of this
|
||||||
this flag."
|
flag."
|
||||||
(set! (buffered-input-continuation? port) val))
|
(set! (buffered-input-continuation? port) val))
|
||||||
|
|
||||||
(define (make-line-buffered-input-port reader)
|
(define (make-buffered-input-port reader)
|
||||||
"Construct a line-buffered input port from the specified @var{reader}.
|
"Construct a line-buffered input port from the specified @var{reader}.
|
||||||
@var{reader} should be a procedure of one argument that somehow reads
|
@var{reader} should be a procedure of one argument that somehow reads
|
||||||
a line of input and returns it as a string @emph{without} the
|
a chunk of input and returns it as a string.
|
||||||
terminating newline character.
|
|
||||||
|
|
||||||
The port created by @code{make-line-buffered-input-port} automatically
|
The port created by @code{make-buffered-input-port} does @emph{not}
|
||||||
adds a newline character after each string returned by @var{reader};
|
interpolate any additional characters between the strings returned by
|
||||||
this makes these ports useful for reading strings that extend across
|
@var{reader}.
|
||||||
more than one input line.
|
|
||||||
|
|
||||||
@var{reader} should take a boolean @var{continuation?} argument.
|
@var{reader} should take a boolean @var{continuation?} argument.
|
||||||
@var{continuation?} indicates whether @var{reader} is being called to
|
@var{continuation?} indicates whether @var{reader} is being called to
|
||||||
|
@ -54,12 +53,12 @@ use the @var{continuation?} argument to determine what prompt to
|
||||||
display to the user.
|
display to the user.
|
||||||
|
|
||||||
The new/continuation distinction is largely an application-level
|
The new/continuation distinction is largely an application-level
|
||||||
concept, and @code{set-buffered-input-continuation?!} allows an
|
concept: @code{set-buffered-input-continuation?!} allows an
|
||||||
application some control over when a read operation is considered to
|
application to specify when a read operation is considered to be new.
|
||||||
be new. But note that if there is data already buffered in the port
|
But note that if there is non-whitespace data already buffered in the
|
||||||
when a new read operation starts, this data will be read before the
|
port when a new read operation starts, this data will be read before
|
||||||
first call to @var{reader}, and so @var{reader} will be called with
|
the first call to @var{reader}, and so @var{reader} will be called
|
||||||
@var{continuation?} set to @code{#t}."
|
with @var{continuation?} set to @code{#t}."
|
||||||
(let ((read-string "")
|
(let ((read-string "")
|
||||||
(string-index -1))
|
(string-index -1))
|
||||||
(letrec ((get-character
|
(letrec ((get-character
|
||||||
|
@ -69,7 +68,7 @@ first call to @var{reader}, and so @var{reader} will be called with
|
||||||
read-string)
|
read-string)
|
||||||
((>= string-index (string-length read-string))
|
((>= string-index (string-length read-string))
|
||||||
(set! string-index -1)
|
(set! string-index -1)
|
||||||
#\nl)
|
(get-character))
|
||||||
((= string-index -1)
|
((= string-index -1)
|
||||||
(set! read-string (reader (buffered-input-continuation? port)))
|
(set! read-string (reader (buffered-input-continuation? port)))
|
||||||
(set! string-index 0)
|
(set! string-index 0)
|
||||||
|
@ -87,4 +86,23 @@ first call to @var{reader}, and so @var{reader} will be called with
|
||||||
(set! (buffered-input-continuation? port) #f)
|
(set! (buffered-input-continuation? port) #f)
|
||||||
port)))
|
port)))
|
||||||
|
|
||||||
|
(define (make-line-buffered-input-port reader)
|
||||||
|
"Construct a line-buffered input port from the specified @var{reader}.
|
||||||
|
@var{reader} should be a procedure of one argument that somehow reads
|
||||||
|
a line of input and returns it as a string @emph{without} the
|
||||||
|
terminating newline character.
|
||||||
|
|
||||||
|
The port created by @code{make-line-buffered-input-port} automatically
|
||||||
|
interpolates a newline character after each string returned by
|
||||||
|
@var{reader}.
|
||||||
|
|
||||||
|
@var{reader} should take a boolean @var{continuation?} argument. For
|
||||||
|
the meaning and use of this argument, see
|
||||||
|
@code{make-buffered-input-port}."
|
||||||
|
(make-buffered-input-port (lambda (continuation?)
|
||||||
|
(let ((str (reader continuation?)))
|
||||||
|
(if (eof-object? str)
|
||||||
|
str
|
||||||
|
(string-append str "\n"))))))
|
||||||
|
|
||||||
;;; buffered-input.scm ends here
|
;;; buffered-input.scm ends here
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue