21.3 Операции над потоками

В этом разделе описаны только те функции, которые работают со всеми потоки. Ввод и вывод информации слегка сложнее и описаны отдельно в главе 22. Интерфейс между потоками и файловой системой описан в главе 23

[Функция] streamp object

streamp истинен, если его аргумент является потоком, иначе ложен.

(streamp x)  (typep x ’stream)

streamp is unaffected by whether its argument, if a stream, is open or closed. In either case it returns true.


[Функция] open-stream-p stream

Если аргумент, который должен быть потоком, открыт, предикат истинен, иначе ложен.

Поток всегда создаётся открытым. Он продолжает быть открытым, пока не будет закрыт с помощью функции close. Макросы with-open-stream, with-input-from-string, with-output-to-string и with-open-file автоматически закрывают созданный поток, когда управление выходит из их тел, по сути открытость совпадает с динамической продолжительностью видимости потока.


[Функция] input-stream-p stream

Если аргумент, который должен быть потоком, может работать для чтения, предикат истинен, иначе ложен.


[Функция] output-stream-p stream

Если аргумент, который должен быть потоком, может работать для записи, предикат истинен, иначе ложен.


[Функция] stream-element-type stream

Функция возвращает спецификатор типа, который указывает на то, какие объекты могут быть прочитаны или записаны из/в поток stream. Потоки созданные с помощью open будут иметь тип элементов, ограниченный подмножеством character или integer. Но в принципе поток может проводить операции используя любые Lisp’овые объекты.


[Функция] close stream &key :abort

Аргумент должен быть потоком. Функцией этот поток закрывается. После чего операции чтения и записи выполняться над ним не могут. Однако, конечно, некоторые операции все ещё могут выполняться. Допускается повторное закрытие уже закрытого потока.

X3J13 voted in January 1989 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:

See the individual descriptions of these functions for more information on how they operate on closed streams.

X3J13 voted in January 1989 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.

Если параметр :abort не-nil (а по-умолчанию он nil), то он указывает на ненормальное завершение использования потока. Осуществляется попытка убрать все побочные эффекты, созданные потоком. Например, если поток выполнял вывод в файл, который был создан вместе с потоком, тогда, если возможно, файл удаляется и любой ранее существовавший файл не заменяется.


[Функция] broadcast-stream-streams broadcast-stream

Аргумент должен быть типа broadcast-stream. Функцией возвращается список потоков для записи (и открытых, и нет).


[Функция] concatenated-stream-streams concatenated-stream

Аргумент должен быть типа concatenated-stream. Функцией возвращается список потоков (и открытых, и нет). Этот список отображает упорядоченное множество потоков для чтения, из которых поток concatenated-stream все ещё может получать данные. Поток, из которого в данный момент читались данные, находится в начале списка. Если потоков для чтения нет, список может быть пустым.


[Функция] echo-stream-input-stream echo-stream
[Функция] echo-stream-output-stream echo-stream

Аргумент должен быть типа echo-stream. Функция echo-stream-input-stream возвращает список потоков для чтения. echo-stream-output-stream возвращает список потоков для записи.


[Функция] synonym-stream-symbol synonym-stream

Аргумент должен быть типа synonym-stream. Эта функция возвращает символ, значение которого является потоком для потока-синонима synonym-stream.


[Функция] two-way-stream-input-stream two-way-stream
[Функция] two-way-stream-output-stream two-way-stream

Аргумент должен быть типа two-way-stream. Функция two-way-stream-input-stream возвращает список потоков для чтения. two-way-stream-output-stream возвращает список потоков для записи.


[Function] interactive-stream-p stream

X3J13 voted in June 1989 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:

The value of *terminal-io* might or might not be interactive.


[Function] stream-external-format stream

X3J13 voted in June 1989 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.