20.5 Функции вывода

В этом разделе описаны функции Lisp для вывода объектов Lisp — преобразования объектов в их представление для вывода.

Некоторые функции вывода Emacs добавляют символы кавычек к выводу при необходимости, чтобы его можно было правильно прочитать. Используемые символы кавычек — ‘"’ и ‘\’; они различают строки и символы, а также предотвращают интерпретацию знаков препинания в строках и символах как разделителей при чтении. Подробности см. в Представление для вывода и синтаксис чтения. Вы указываете использование кавычек или их отсутствие выбором функции вывода.

Если текст должен быть прочитан обратно в Lisp, то следует выводить его с символами кавычек, чтобы избежать неоднозначности. Точно так же, если цель состоит в том, чтобы четко описать объект Lisp для программиста Lisp. Однако, если цель вывода — выглядеть красиво для человека, то обычно лучше выводить без кавычек.

Объекты Lisp могут ссылаться на себя. Вывод самоссылающегося объекта обычным способом потребовал бы бесконечного объема текста, и попытка могла вызвать бесконечную рекурсию. Emacs обнаруживает такую рекурсию и выводит ‘#level’ вместо рекурсивного вывода объекта, который уже выводится. Например, здесь ‘#0’ указывает на рекурсивную ссылку на объект на уровне 0 текущей операции вывода:

(setq foo (list nil))
     ⇒ (nil)
(setcar foo foo)
     ⇒ (#0)

В приведенных ниже функциях stream обозначает поток вывода. (См. предыдущий раздел для описания потоков вывода. Также см. external-debugging-output, полезное значение потока для отладки.) Если stream равно nil или опущено, по умолчанию используется значение standard-output.

Функция: print object &optional stream

Функция print — это удобный способ вывода. Она выводит представление для вывода object в stream, выводя дополнительный перевод строки перед object и еще один после него. Используются символы кавычек. print возвращает object. Например:

(progn (print 'The\ cat\ in)
       (print "the hat")
       (print " came back"))
     -|
     -| The\ cat\ in
     -|
     -| "the hat"
     -|
     -| " came back"
     ⇒ " came back"
Функция: prin1 object &optional stream overrides

Эта функция выводит представление для вывода object в stream. Она не выводит переводы строк для разделения вывода, как print, но использует символы кавычек, как и print. Она возвращает object.

(progn (prin1 'The\ cat\ in)
       (prin1 "the hat")
       (prin1 " came back"))
     -| The\ cat\ in"the hat"" came back"
     ⇒ " came back"

Если overrides не равно nil, оно должно быть либо t (что указывает prin1 использовать значения по умолчанию для всех переменных, связанных с выводом), либо списком настроек. Подробности см. в Переопределение переменных вывода.

Функция: princ object &optional stream

Эта функция выводит представление для вывода object в stream. Она возвращает object.

Эта функция предназначена для создания вывода, который читаем для людей, а не для read, поэтому она не вставляет символы кавычек и не заключает содержимое строк в двойные кавычки. Она не добавляет никакого пробела между вызовами.

(progn
  (princ 'The\ cat)
  (princ " in the \"hat\""))
     -| The cat in the "hat"
     ⇒ " in the \"hat\""
Функция: terpri &optional stream ensure

Эта функция выводит перевод строки в stream. Название означает «завершить вывод». Если ensure не равно nil, перевод строки не выводится, если stream уже находится в начале строки. Обратите внимание, в этом случае stream не может быть функцией, и будет выдан сбой, если это так. Эта функция возвращает t, если перевод строки был выведен.

Функция: write-char character &optional stream

Эта функция выводит character в stream. Она возвращает character.

Функция: flush-standard-output

Если у вас есть пакетные скрипты на Emacs, которые отправляют вывод в терминал, Emacs автоматически отобразит вывод всякий раз, когда вы пишете символ перевода строки в standard-output. Эта функция позволяет сбросить вывод в standard-output без предварительной отправки символа перевода строки, что позволяет отображать незавершенные строки.

Функция: prin1-to-string object &optional noescape overrides

Эта функция возвращает строку, содержащую текст, который prin1 вывел бы для того же аргумента.

(prin1-to-string 'foo)
     ⇒ "foo"
(prin1-to-string (mark-marker))
     ⇒ "#<marker at 2773 in strings.texi>"

Если overrides не равно nil, оно должно быть либо t (что указывает prin1 использовать значения по умолчанию для всех переменных, связанных с выводом), либо списком настроек. Подробности см. в Переопределение переменных вывода.

Если noescape не равно nil, это запрещает использование символов кавычек в выводе. (Этот аргумент поддерживается в версиях Emacs 19 и выше.)

(prin1-to-string "foo")
     ⇒ "\"foo\""
(prin1-to-string "foo" t)
     ⇒ "foo"

См. format в Форматирование строк для других способов получения представления для вывода объекта Lisp в виде строки.

Макрос: with-output-to-string body…

Этот макрос выполняет формы body с standard-output, настроенным для направления вывода в строку. Затем он возвращает эту строку.

Например, если имя текущего буфера — ‘foo’,

(with-output-to-string
  (princ "The buffer is ")
  (princ (buffer-name)))

он возвращает "The buffer is foo".

Функция: pp object &optional stream

Эта функция выводит object в stream, подобно prin1, но делает это более красиво. То есть, она отступырует и заполняет объект, чтобы сделать его более читаемым для человека.

Если вам необходимо использовать бинарный ввод/вывод в пакетном режиме, например, использовать функции, описанные в этом разделе, для записи произвольных бинарных данных или избежать преобразования переводов строк на не-POSIX хостах, см. set-binary-mode.