Common Lisp the Language, 2nd Edition
This section contains discussion of only those operations that are common to all streams. Input and output is rather complicated and is discussed separately in chapter 22. The interface between streams and the file system is discussed in chapter 23.
streamp is true if its argument is a stream, and otherwise is false.
(streamp x) == (typep x 'stream)
X3J13 voted in January 1989 (CLOSED-STREAM-OPERATIONS) to specify that streamp is unaffected by whether its argument, if a stream, is open or closed. In either case it returns true.
X3J13 voted in January 1989 (STREAM-ACCESS) to add the predicate open-stream-p. It is true if its argument (which must be a stream) is open, and otherwise is false.
A stream is always created open; it remains open until closed
with the close function. The macros with-open-stream,
and with-open-file automatically close the created stream
as control leaves their bodies, in effect imposing dynamic extent
on the openness of the stream.
This predicate is true if its argument (which must be a stream) can handle input operations, and otherwise is false.
This predicate is true if its argument (which must be a stream) can handle output operations, and otherwise is false.
A type specifier is returned to indicate what objects may be read from or written to the argument stream, which must be a stream. Streams created by open will have an element type restricted to a subset of character or integer, but in principle a stream may conduct transactions using any Lisp objects.
close stream &key :abort
The argument must be a stream. The stream is closed. No further input/output operations may be performed on it. However, certain inquiry operations may still be performed, and it is permissible to close an already closed stream.
X3J13 voted in January 1989 (CLOSED-STREAM-OPERATIONS) and revised the vote in March 1989 to specify that if close is called on an open stream, the stream is closed and t is returned; but if close is called on a closed stream, it succeeds without error and returns an unspecified value. (The rationale for not specifying the value returned for a closed stream is that in some implementations closing certain streams does not really have an effect on them-for example, closing the *terminal-io* stream might not ``really'' close it-and it is not desirable to force such implementations to keep otherwise unnecessary state. Portable programs will of course not rely on such behavior.)
X3J13 also voted in January 1989 to specify exactly which inquiry functions may be applied to closed streams:
streamp pathname-host namestring pathname pathname-device file-namestring truename pathname-directory directory-namestring merge-pathnames pathname-name host-namestring open pathname-type enough-namestring probe-file pathname-version directorySee the individual descriptions of these functions for more information on how they operate on closed streams.
X3J13 voted in January 1989 (CLOSE-CONSTRUCTED-STREAM) to clarify the effect of closing various kinds of streams. First some terminology:
The effect of applying close to a constructed stream is to close that stream only. No input/output operations are permitted on the constructed stream once it has been closed (though certain inquiry functions are still permitted, as described above).
Closing a composite stream has no effect on its constituents; any constituents that are open remain open.
If a stream created by make-string-output-stream is closed,
the result of then applying get-output-stream-string to the
stream is unspecified.
If the :abort parameter is not nil (it defaults to nil), it indicates an abnormal termination of the use of the stream. An attempt is made to clean up any side effects of having created the stream in the first place. For example, if the stream performs output to a file that was newly created when the stream was created, then if possible the file is deleted and any previously existing file is not superseded.
X3J13 voted in January 1989 (STREAM-ACCESS) to add the following accessor functions for obtaining information about streams.
The argument must be of type broadcast-stream. A list of the constituent output streams (whether open or not) is returned.
The argument must be of type concatenated-stream. A list of constituent streams (whether open or not) is returned. This list represents the ordered set of input streams from which the concatenated stream may yet read; the stream from which it is currently reading is first in the list. The list may be empty if no more streams remain to be read.
The argument must be of type echo-stream. The function echo-stream-input-stream returns the constituent input stream; echo-stream-output-stream returns the constituent output stream.
The argument must be of type synonym-stream. This function returns the symbol for whose value the synonym-stream is a synonym.
The argument must be of type two-way-stream. The function two-way-stream-input-stream returns the constituent input stream; two-way-stream-output-stream returns the constituent output stream.
X3J13 voted in June 1989 (STREAM-CAPABILITIES) to add the predicate interactive-stream-p, which returns t if the stream is interactive and otherwise returns nil. A type-error error is signalled if the argument is not of type stream.
The precise meaning of interactive-stream-p is implementation-dependent and may depend on the underlying operating system. The intent is to distinguish between interactive and batch (background, command-file) operations. Some characteristics that might distinguish a stream as interactive:
X3J13 voted in June 1989 (MORE-CHARACTER-PROPOSAL) to add the function stream-external-format, which returns a specifier for the implementation-recognized scheme used for representing characters in the argument stream. See the :external-format argument to open.