io: convert make-input-port to object style

Sortof. This is where we especially take advantage of vtable
flexibility. The methods of the vtable are really closures,
because that's far more convenient for custom ports.
This commit is contained in:
Matthew Flatt 2019-02-12 12:11:17 -07:00
parent 6e85165b3c
commit c57b52eb70
4 changed files with 58 additions and 50 deletions

View File

@ -261,39 +261,40 @@
(cond (cond
[user-peek-in [user-peek-in
(make-core-input-port (new core-input-port
#:name name #:override
#:self #f ([read-in (if (input-port? user-read-in)
#:read-in
(if (input-port? user-read-in)
user-read-in user-read-in
read-in) read-in)]
#:peek-in [peek-in (if (input-port? user-peek-in)
(if (input-port? user-peek-in)
user-peek-in user-peek-in
peek-in) peek-in)]
#:byte-ready [byte-ready (if (input-port? user-peek-in)
(if (input-port? user-peek-in)
user-peek-in user-peek-in
byte-ready) byte-ready)]
#:close close [close close]
#:get-progress-evt (and user-get-progress-evt get-progress-evt) [get-progress-evt (and user-get-progress-evt get-progress-evt)]
#:commit (and user-commit commit) [commit (and user-commit commit)]
#:get-location get-location [get-location get-location]
#:count-lines! count-lines! [count-lines! count-lines!]
#:init-offset init-offset [file-position file-position]
#:file-position file-position [buffer-mode buffer-mode])
#:buffer-mode buffer-mode)] [name name]
[offset init-offset])]
[else [else
(define-values (port buffer-flusher) (new peek-via-read-input-port
(open-input-peek-via-read #:override
#:name name ([read-in/inner read-in]
#:self #f [close (values
#:read-in read-in (lambda (self)
#:close close (close self)
#:get-location get-location (send peek-via-read-input-port self close-peek-buffer)))]
#:count-lines! count-lines! [get-location get-location]
#:init-offset init-offset [count-lines! count-lines!]
#:file-position file-position [file-position file-position]
#:alt-buffer-mode buffer-mode)) [buffer-mode (or buffer-mode
port])) (case-lambda
[(self) (send peek-via-read-input-port self default-buffer-mode)]
[(self mode) (send peek-via-read-input-port self default-buffer-mode mode)]))])
[name name]
[offset init-offset])]))

View File

@ -1,14 +1,15 @@
#lang racket/base #lang racket/base
(require "output-port.rkt") (require "../common/class.rkt"
"output-port.rkt")
(provide open-output-nowhere) (provide open-output-nowhere)
(class nowhere-output-port #:extends core-output-port
(override
[write-out-special
(lambda (any no-block/buffer? enable-break?)
#t)]))
(define (open-output-nowhere) (define (open-output-nowhere)
(make-core-output-port #:name 'nowhere (new nowhere-output-port
#:self #f [name 'nowhere]))
#:evt always-evt
#:write-out (lambda (self bstr start-k end-k no-block/buffer? enable-break? copy?)
(- end-k start-k))
#:close void
#:write-out-special (lambda (self any no-block/buffer? enable-break?)
#t)))

View File

@ -67,7 +67,7 @@
;; The return values are the same as documented for ;; The return values are the same as documented for
;; `make-output-port`. ;; `make-output-port`.
[write-out (lambda (bstr start-k end-k no-block/buffer? enable-break? copy?) [write-out (lambda (bstr start-k end-k no-block/buffer? enable-break? copy?)
(- start-k end-k))] (- end-k start-k))]
;; #f or (any no-block/buffer? enable-break? -*> boolean?) ;; #f or (any no-block/buffer? enable-break? -*> boolean?)
;; Called in atomic mode. ;; Called in atomic mode.

View File

@ -41,7 +41,13 @@
[buffer-adjust-pos [buffer-adjust-pos
(lambda (i) (lambda (i)
(- i (fx- end-pos (if buffer buffer-pos pos))))]) (- i (fx- end-pos (if buffer buffer-pos pos))))]
;; in atomic mode
[default-buffer-mode
(case-lambda
[() buffer-mode]
[(mode) (set! buffer-mode mode)])])
(private (private
;; in atomic mode ;; in atomic mode
@ -218,8 +224,8 @@
;; in atomic mode ;; in atomic mode
[buffer-mode [buffer-mode
(case-lambda (case-lambda
[(self) buffer-mode] [() (default-buffer-mode)]
[(self mode) (set! buffer-mode mode)])] [(mode) (default-buffer-mode mode)])]
;; in atomic mode ;; in atomic mode
[close [close