This site is a static rendering of the Trac instance that was used by R7RS-WG1 for its work on R7RS-small (PDF), which was ratified in 2013. For more information, see Home.
Source for wiki PortsCowan version 1
author
cowan
comment
ipnr
198.185.18.207
name
PortsCowan
readonly
0
text
== Ports ==
Here's my proposal for Thing One ports and I/O facilities. It's fully upward compatible with R5RS, but takes ideas from R6RS, SRFI-91 and SRFI-6. Many of the concepts are present in R6RS under other names.
== Port model ==
In this proposal, as in Gambit Scheme and SRFI 91, there are two classes of ports, binary ports and character ports. Unusually, ''every binary port is automatically a character port.'' This implies that some character encoding must be associated with each binary port so that character I/O can be performed on it. The only encoding that implementations MUST support is ASCII, so this is relatively cost-free, since for ASCII there need be no separate character buffer or encoding translation table.
This proposal does not specify any way to create a bidirectional port, but allows for their possible existence in an implementation. Sockets, terminals, and pipes are all examples.
== Filename model ==
In this proposal, a filename may be specified either as a string or as a ''settings list'', which is a (disembodied) property list where every key is a symbol ending in a colon. For convenience, these symbols are also defined as identifiers. Implementations MUST support the following keys:
`path:`
Specifies the filename. The interpretation of filenames is implementation-dependent. There is no default value; this key MUST be present.
`buffering:`
Specifies what kind of buffering is present. The value `#f` means there is no buffering; `binary` means that there is a binary buffer but no character buffer; `#t` means there both character and binary buffering. Other values MAY be specified by an implementation. Buffer sizes are implementation-dependent. The default value is implementation-dependent.
`encoding:`
Specifies what character encoding to use on a binary port. The value `US-ASCII` MUST be supported. The values `ISO-8859-1`, and `UTF-8` SHOULD be supported if the implementation contains the appropriate repertoire of characters. Other values MAY be supported. The default value is implementation-dependent.
If a BOM (Byte Order Mark, U+FEFF) is present at the beginning of input on a port encoded as UTF-8, it is skipped. A BOM is not automatically written on output. Implementations MAY provide a way around this.
`newline:`
Specifies how to translate newlines. The value `#f` means that there is no translation. Any other value causes all of CR, LF, CR+LF, NEL, CR+NEL, and U+2028 to be translated to `#\newline` on input. On output, the values `cr`, `lf`, and `crlf` mean that `#\newline` is translated to CR, LF, or CR+LF respectively. Other values MAY be specified by an implementation. The default value is implementation-dependent.
`case-sensitive:`
Specifies if Scheme symbols are read from the port case-sensitively or not. The value `#f` means that upper-case letters in symbols are translated to lower case unless escaped; `#t` means that no translation is done. The default value is implementation-dependent.
== Core module ==
All these procedures are required in a WG1 Scheme system and form part of the core module.
=== Port objects ===
`(input-port? `''port''`)`
`(output-port? `''port''`)`
Same as R5RS, but also return true on input/output ports.
`port?`
Mentioned in R5RS section 3 but not in section 6.6. Part of R6RS.
`(current-input-port)`
`(current-output-port)`
Same as R5RS. These are binary ports whose character encoding is implementation-specified.
`(current-error-port)`
From R6RS. This is a binary port whose character encoding is implementation-specified.
`(force-output ` [ ''output-port'' ] ` ` [ ''character-only?'' ]`)`
Drains the character buffer of ''output-port'', if any. Then, if the port is an output port and the second argument is false, drains the binary buffer, if any. The default output port is the current output port.
`(close-input-port `''port''`)`
`(close-output-port `''port''`)`
From R5RS. `Close-output-port` implicitly calls `force-output` first.
`(close-port)`
Closes both sides of a bidirectional port; otherwise the same as `close-input-port` or `close-output-port` as the case may be.
`(eof-object? `''obj''`)`
Same as R5RS.
=== Character I/O ===
`(character-port? `''port''`)`
Returns `#t` if ''port'' is a character port. SRFI 91 calls this `char-port`.
`(read-char `[ ''input-port'' ]`)`
`(write-char `[ ''output-port'' ]`)`
`(newline `[ ''output-port'' ]`)`
`(peek-char `[ ''input-port'' ]`)`
`(char-ready? `[ ''input-port'' ]`)`
Same as R5RS.
`(read-line `[ ''port'' ]`)`
Same as R6RS. Reads a line from ''port'' (or the current input port) terminated by a `#\newline` character. This is a convenience function.
`(open-input-string `''string''`)`
Same as SRFI 6.
`(open-output-string)`
Same as SRFI 6. String ports are character ports, but not binary ports.
`(get-output-string `''output-string-port''`)`
Same as SRFI 6.
=== Binary I/O ===
`(binary-port? `''port''`)`
Returns `#t` if ''port'' is a binary port. String ports are character ports, but not binary ports; file ports are both. SRFI 91 calls this `byte-port`.
`(read-u8 `[ ''binary-input-port'' ]`)`
`(write-u8 `[ ''binary-output-port'' ]`)`
`(peek-u8 `[ ''binary-input-port'' ]`)`
`(u8-ready? `[ ''binary-input-port'' ]`)`
The direct binary analogues of `read-char`, `write-char`, `newline`, `peek-char`, and `char-ready?` respectively. They return an exact integer between 0 and 255 rather than a character. SRFI 91 talks of `byte` rather than `u8`.
== File Module ==
This is a separate module because some implementations will not have access to a file system.
`(call-with-input-file `''filename''` `''proc''`)`
`(call-with-output-file `''filename''` `''proc''`)`
`(with-input-from file `''filename''` `''thunk''`)`
`(with-output-to-file `''filename''` `''thunk''`)`
`(open-input-file `''filename''`)`
`(open-output-file `''filename''`)`
Same as R5RS, except that any ''filename'' argument may be a string or a settings list.
`(delete-file `''filename''`)`
`(file-exists? `''filename''`)`
Same as R6RS. Only string filenames are supported.
== Read Module ==
This is a separate module because many systems, especially embedded ones, don't require the ability to read general Scheme objects, and very small implementations may not want the overhead of a Scheme parser.
`(read ` [ ''input-port'' ]`)`
Same as R5RS.
== Write Module ==
This is a separate module for the same reasons as the read module.
`(write `''obj'' [ ''output-port'' ]`)`
Same as R5RS, but specifies that only ASCII characters may be output (for re-readability). Non-ASCII characters in symbols, strings, and character literals MUST be escaped.
`(display `''obj'' [ ''port'' ]`)`
Same as R5RS. It is an error to output characters not present in the encoding of ''output-port''.
== Thanks ==
Thanks to the R5RS and R6RS editors; to Marc Feeley, author of SRFI 91 and Gambit-C; and to Will Clinger, author of SRFI 6.
time
2010-09-02 19:59:05
version
1