Moving on to the stream-element-type function. We should first describe streams and their element types. A stream in Lisp looks a little like an iostream in C++. It is an opaque object that defines an interaction between the program and what a UNIX system would call a character device (as opposed to a block device). A stream may take special action to distinguish between text and binary data, and has equivalents to tellp and seekp.
A Lisp stream has an associated element type which must be a subtype of character or of integer. If it’s a subtype of character, it can be used with functions like format, read, and others. If it’s a subtype of integer, it can be used with functions like read-byte, write-byte, read-sequence, and write-sequence.
The stream-element-type function allows the programmer to detect at runtime whether a stream is a character stream or an integer stream. Appropriate behaviour can then take place based on the compatibility with that particular stream.
One thing I will note. While I was testing behaviour in SBCL 1.1.14, I was a bit surprised to see that the write-byte and read-byte functions, while defined in the CLHS as writing individual bytes, actually write and read one entry from the stream. If the stream element type is (integer 0 65535), the entries are 16 bits long, and read-byte reads a 16-bit word from the stream, not a single byte. I was unable to find anything in the CLHS among the clarifying notes that would tell me whether this is required, allowed, or a bug. If anybody knows, please pass on your knowledge in the comments.