Spec-Zone.ru › Elisp

Потоки вывода

Поток вывода определяет, что делать с символами, производимыми при печати. Большинство функций печати принимают поток вывода в качестве необязательного аргумента. Вот возможные типы потоков вывода:

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API