Потоки вывода
Поток вывода определяет, что делать с символами, производимыми при печати. Большинство функций печати принимают поток вывода в качестве необязательного аргумента. Вот возможные типы потоков вывода:
- buffer
-
Символы вывода вставляются в buffer в указанной точке. Точка смещается по мере вставки символов.
- marker
-
Символы вывода вставляются в буфер, на который указывает marker, в позиции маркера. Позиция маркера смещается по мере вставки символов. Значение точки в буфере не оказывает влияния на печать при использовании потока маркера, и этот тип печати не перемещает точку (за исключением того, что если маркер указывает на позицию точки или перед ней, точка смещается вместе с окружающим текстом, как обычно).
- function
-
Символы вывода передаются в function, которая отвечает за их сохранение. Она вызывается с одним символом в качестве аргумента столько раз, сколько символов необходимо вывести, и отвечает за сохранение символов в нужном месте.
t-
Символы вывода отображаются в области эха. Если Emacs работает в пакетном режиме (см. Пакетный режим), вывод записывается в стандартный дескриптор вывода.
nil-
nilуказанный как поток вывода, означает использование значения переменнойstandard-output; это значение является потоком вывода по умолчанию и не должно бытьnil. - symbol
Символ в качестве потока вывода эквивалентен определению функции символа (если таковое имеется).
Многие допустимые потоки вывода также допустимы в качестве потоков ввода. Разница между потоками ввода и вывода, следовательно, больше связана с тем, как вы используете объект Lisp, чем с разными типами объектов.
Вот пример буфера, используемого в качестве потока вывода. Точка изначально расположена, как показано, непосредственно перед ‘h’ в ‘the’. В конце точка расположена непосредственно перед той же самой ‘h’.
---------- Buffer: foo ---------- This is t∗he contents of foo. ---------- Buffer: foo ----------
(print "This is the output" (get-buffer "foo"))
⇒ "This is the output"
---------- Buffer: foo ---------- This is t "This is the output" ∗he contents of foo. ---------- Buffer: foo ----------
Теперь мы покажем использование маркера в качестве потока вывода. Изначально маркер находится в буфере foo, между ‘t’ и ‘h’ в слове ‘the’. В конце маркер сместился за вставленный текст, так что он остается расположенным перед той же ‘h’. Обратите внимание, что положение точки, показанное обычным способом, не влияет.
---------- Buffer: foo ---------- This is the ∗output ---------- Buffer: foo ----------
(setq m (copy-marker 10))
⇒ #<marker at 10 in foo>
(print "More output for foo." m)
⇒ "More output for foo."
---------- Buffer: foo ---------- This is t "More output for foo." he ∗output ---------- Buffer: foo ----------
m
⇒ #<marker at 34 in foo>
Следующий пример показывает вывод в область эха:
(print "Echo Area output" t)
⇒ "Echo Area output"
---------- Echo Area ----------
"Echo Area output"
---------- Echo Area ----------
Наконец, мы покажем использование функции в качестве потока вывода. Функция eat-output берет каждый полученный символ и присоединяет его к началу списка last-output (см. Создание списков). В конце список содержит все выведенные символы, но в обратном порядке.
(setq last-output nil)
⇒ nil
(defun eat-output (c)
(setq last-output (cons c last-output)))
⇒ eat-output
(print "This is the output" #'eat-output)
⇒ "This is the output"
last-output
⇒ (10 34 116 117 112 116 117 111 32 101 104
116 32 115 105 32 115 105 104 84 34 10)
Теперь мы можем расположить вывод в правильном порядке, перевернув список:
(concat (nreverse last-output))
⇒ "
\"This is the output\"
"
Вызов concat преобразует список в строку, чтобы вы могли более четко видеть его содержимое.
- Функция: external-debugging-output символ
-
Эта функция может быть полезна в качестве потока вывода при отладке. Она записывает символ в поток стандартной ошибки.
Например
(print "This is the output" #'external-debugging-output) -| This is the output ⇒ "This is the output"
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Output-Streams.html