21.2 Создание новых потоков

Пожалуй самые важные конструкции для создания новых потоков это то, которые открывают файлы. Смотрите with-open-file и open. Следующие функции создают потоки без ссылок на файловую систему.

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

make-synonym-stream создаёт и возвращает поток-синоним. Любые операции на новом потоке будут проделаны на потоке, являющемся значением динамической переменной с именем symbol. Если значение этой переменной изменится или будет пересвязано, то поток-синоним будет воздействовать на новый установленный поток.

The result of make-synonym-stream is always a stream of type synonym-stream. Note that the type of a synonym stream is always synonym-stream, regardless of the type of the stream for which it is a synonym.

Результат make-synonym-stream всегда является потоком типа synonym-stream.

Следует отметить, что тип потока-синонима всегда synonym-stream, вне зависимости от того, какой тип у связанного потока.


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

Эта функция возвращает поток, который работает только для записи. Любая выходная информация, посланная в этот поток, будет отослана в все указанные потоки streams. Множество операций, которые могут быть выполнены на новом потоке, является пересечением множеств операций для указанных потоков. Результаты, возвращаемые операциями над новым потоком, являются результатами возвращёнными операциями на последнем потоке из списка streams. Результаты полученные в ходе выполнения функции над всеми, кроме последнего, потоками игнорируются. Если не было передано ни одного потока в аргументе streams, тогда результат является «кусочком клоаки». Вся выводимая информация будет игнорироваться.

Результат make-broadcast-stream всегда является потоком типа broadcast-stream.


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

Данная функция возвращает поток, который работает только для чтения. Входная информация берётся из первого потоки из списка streams пока указатель не достигнет конца-файла end-of-file, затем данный поток откладывается, и входная информация берётся из следующего, и так далее. Если список потоков stream был пуст, то возвращается поток без содержимого. Любая попытка чтения будет возвращать конец-файла end-of-file.

Результат make-concatenated-stream всегда является потоком типа concatenated-stream.


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

Данная функция возвращает поток для чтения и записи, который входную информацию получает из input-stream и посылает выходную информацию в output-stream.

Результат make-two-way-stream всегда является потоком типа two-stream-stream.


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

Данная функция возвращает поток для чтения и записи, который получает входную информацию из input-stream и отсылает выходную в output-stream. В дополнение, входная информация посылается в output-stream (эхо).

Результат make-echo-stream всегда является потоком типа echo-stream.

X3J13 voted in January 1989 to clarify the interaction of read-char, unread-char, and peek-char with echo streams. (See the descriptions of those functions for details.)

X3J13 explicitly noted that the bidirectional streams that are the initial values of *query-io*, *debug-io*, and *terminal-io*, even though they may have some echoing behavior, conceptually are not necessarily the products of calls to make-echo-stream and therefore are not subject to the new rules about echoing on echo streams. Instead, these initial interactive streams may have implementation-dependent echoing behavior.


[Функция] make-string-input-stream string &optional start end

Данная функция возвращает поток для чтения. Данный поток последовательно будет сохранять буквы в подстроке в строке string ограниченной с помощью start и end. После того, как будет достигнут последний символ, поток вернёт конец-файла.

Результат make-string-input-stream всегда является потоком типа string-stream.


[Функция] make-string-output-stream &key :element-type

Данная функция возвращает поток для записи, который будет аккумулировать всю полученную информацию в строку, которая может быть получена с помощью функции get-output-stream-string.

Аргумент :element-type указывает, какие символы могут приниматься потоком. Если аргумент :element-type опущен, созданный поток должен принимать все символы.

Результатом make-string-output-stream всегда является поток типа string-stream.


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

Данная функция возвращает строку, для потока, возвращённого функцией make-string-output-stream, которая содержит все записанную в данный поток информацию. После этого поток сбрасывается. Таким образом каждый вызов get-output-stream-string возвращает только те символы, которые были записаны с момента предыдущего вызова этой функции (или создания потока, если предыдущего вызова ещё не было).


[Макрос] with-open-stream (var stream) {declaration}* {form}*

Форма stream вычисляется и должна вернуть поток. Переменная var связывается с этим потоком, и затем выполняются формы тела как неявный progn. Результатом выполнения with-open-stream является значение последней формы. Поток автоматически закрывается при выходе из формы with-open-stream, вне зависимости от типа выхода. Смотрите close. Поток следует рассматривать, как имеющий динамическую продолжительность видимости.

Результатом with-open-stream всегда является поток типа file-stream.


[Макрос] with-input-from-string (var string {keyword value}*){declaration}* {form}*

Тело выполняется как неявный progn с переменной var связанной с потоком символов для чтения, который последовательно предоставляет символы из значения формы string. with-input-from-string возвращает результат выполнения последней формы form тела.

Результатом with-input-from-stream всегда является поток типа string-stream.

В параметрах могут использоваться следующие имена:

  • :index
  • Форма после :index должна быть местом, в которое можно осуществить запись с помощью setf. Если форма with-input-from-string завершается нормально, то место будет содержать позицию первого не прочитанного символа из строки string (или длину строки, если все символы были прочитаны). Место не изменяется в процессе чтения, а только во время выхода.
  • :start
  • :start принимает аргумент, указывающий позицию с которой необходимо начинать чтение символов из строки string.
  • :end
  • The :end keyword takes an argument indicating, in the manner usual for sequence functions, the end of a substring of string to be used. :end принимает аргумент, указывающий на позицию на которой необходимо завершить чтение символов из строки string

The :start and :index keywords may both specify the same variable, which is a pointer within the string to be advanced, perhaps repeatedly by some containing loop.

Вот простой пример использования with-input-from-string:

(with-input-from-string (s "Animal Crackers" :index j :start 6)
  (read s))  crackers

В качестве побочного эффекта переменная j будет установлена в 15.

X3J13 voted in January 1989 to restrict user side effects; see section 7.9.

:start и :index могут оба содержать одну переменную, указывающую позицию в строке, возможно, внутри цикла.


[Макрос] with-output-to-string (var [string [:element-type type]]){declaration}* {form}*

Можно указать nil вместо строки string и использовать аргумент :element-type для указания, какие символы должны приниматься созданным потоком. Если аргумент string не указан или он nil и не указан :element-type, то созданный поток должен принимать все символы.

If string is specified, it must be a string with a fill pointer; the output is incrementally appended to the string (as if by use of vector-push-extend).

In this way output cannot be accidentally lost. This change makes with-output-to-string behave in the same way that format does when given a string as its first argument.

Результатом with-output-to-stream всегда является поток типа string-stream.

X3J13 voted in January 1989 to restrict user side effects; see section 7.9.