The uses of custom ports John Cowan (22 Apr 2020 19:45 UTC)
Re: The uses of custom ports Marc Nieper-Wißkirchen (23 Apr 2020 13:07 UTC)
Re: The uses of custom ports John Cowan (23 Apr 2020 14:01 UTC)
Re: The uses of custom ports Marc Feeley (23 Apr 2020 14:25 UTC)
Re: The uses of custom ports Lassi Kortela (23 Apr 2020 14:31 UTC)
Re: The uses of custom ports Marc Feeley (23 Apr 2020 14:43 UTC)
Re: The uses of custom ports Marc Nieper-Wißkirchen (23 Apr 2020 14:35 UTC)
Re: The uses of custom ports John Cowan (23 Apr 2020 14:39 UTC)

Re: The uses of custom ports Marc Feeley 23 Apr 2020 14:43 UTC

> On Apr 23, 2020, at 10:31 AM, Lassi Kortela <xxxxxx@lassi.io> wrote:
>
> Does Gambit have the ability to make custom ports from arbitrary closures?
>
> What do these do:
>
> > (apropos "generic")
> "##" namespace:
>  generic-hash, open-file-generic, open-file-generic-from-psettings, open-process-generic, open-string-generic, open-string-pipe-generic, open-u8vector-generic,
>  open-u8vector-pipe-generic, open-vector-generic, open-vector-pipe-generic, write-generic-to-character-port
>

“generic” in those names does not refer to generic ports… rather the common code for several “open” variants, such as open-input-file, open-output-file, open-input-output-file, with-input-from-file, etc that call ##open-file-generic.

No Gambit does not currently support an API to create custom ports.  However, this would be easy to add because the port representation contains a procedure for every method (in the OO sense).

For example, here is the type definition for the port type that is at the base of the inheritance tree:

(define-type port
  id: fe3e988a-c59d-47ce-8592-93b02ce12af1
  type-exhibitor: macro-type-port
  constructor: macro-make-port
  implementer: implement-type-port
  macros:
  prefix: macro-
  opaque:
  unprintable:

  extender: define-type-of-port

  mutex              ;; access to the port is controlled with this mutex

  rkind              ;; port kind for reading (none-port if can't read)
  wkind              ;; port kind for writing (none-port if can't write)

  name               ;; procedure which returns the name of the port

  wait               ;; procedure for waiting until port readable or writable

  close              ;; procedure to close the port

  roptions           ;; options for reading (buffering type, encoding, etc)
  rtimeout           ;; time at which a read that would block times out
  rtimeout-thunk     ;; thunk called when a read timeout occurs
  set-rtimeout       ;; procedure to set rtimeout and rtimeout-thunk

  woptions           ;; options for writing (buffering type, encoding, etc)
  wtimeout           ;; time at which a write that would block times out
  wtimeout-thunk     ;; thunk called when a write timeout occurs
  set-wtimeout       ;; procedure to set wtimeout and wtimeout-thunk

  io-exception-handler ;; procedure to handle I/O exceptions on this port
)

“Object ports” are a subtype of that:

(define-type-of-port object-port
  id: a4ef4750-7ce6-4388-9d5f-48e04bf3ae4b
  type-exhibitor: macro-type-object-port
  constructor: macro-make-object-port
  implementer: implement-type-object-port
  macros:
  prefix: macro-
  opaque:
  unprintable:

  extender: define-type-of-object-port

  read-datum         ;; procedure to read a datum
  write-datum        ;; procedure to write a datum
  newline            ;; procedure to write a datum separator
  force-output       ;; procedure to force output to occur on target device
)

“Character ports” are a subtype of that:

(define-type-of-object-port character-port
  id: a7e0fe95-65e9-4b00-b080-b7e6b12d9c6f
  type-exhibitor: macro-type-character-port
  constructor: macro-make-character-port
  implementer: implement-type-character-port
  macros:
  prefix: macro-
  opaque:
  unprintable:

  extender: define-type-of-character-port

  rbuf               ;; character read buffer (a string)
  rlo                ;; low pointer (start of unread characters)
  rhi                ;; high pointer (end of unread characters)
  rchars             ;; number of characters read at start of read buffer
  rlines             ;; number of lines read up to low pointer
  rcurline           ;; absolute character position where current line starts
  rbuf-fill          ;; procedure to read characters into the read buffer
  peek-eof?          ;; peeking the next character should return end-of-file?

  wbuf               ;; character write buffer (a string)
  wlo                ;; low pointer (start of unwritten characters)
  whi                ;; high pointer (end of unwritten characters)
  wchars             ;; number of characters written at start of write buffer
  wlines             ;; number of lines written up to high pointer
  wcurline           ;; absolute character position where current line starts
  wbuf-drain         ;; procedure to write characters from the write buffer

  input-readtable    ;; readtable for reading
  output-readtable   ;; readtable for writing
  output-width       ;; procedure to get the output width in characters
)

And finally “Byte ports” are a subtype of that:

(define-type-of-character-port byte-port
  id: fe99424c-d1da-48f1-b613-9c735692790e
  type-exhibitor: macro-type-byte-port
  constructor: macro-make-byte-port
  implementer: implement-type-byte-port
  macros:
  prefix: macro-
  opaque:
  unprintable:

  extender: define-type-of-byte-port

  rbuf               ;; byte read buffer (a u8vector)
  rlo                ;; low pointer (start of unread bytes)
  rhi                ;; high pointer (end of unread bytes)
  rbuf-fill          ;; procedure to read bytes into the read buffer

  wbuf               ;; byte write buffer (a u8vector)
  wlo                ;; low pointer (start of unwritten bytes)
  whi                ;; high pointer (end of unwritten bytes)
  wbuf-drain         ;; procedure to write bytes from the write buffer
)

Marc