20.5 输出函数

本节描述用于打印 Lisp 对象的 Lisp 函数 — 即将对象转换为其打印表示形式。

部分 Emacs 打印函数会在必要时为输出添加引用字符,以确保其能被正确读取。 使用的引用字符为 ‘"’ 和 ‘\’;这些字符用于区分字符串(string)与符号(symbol),并防止字符串和符号中的标点字符在读取时被当作分隔符。 See 打印表示与读入语法。 你可以通过选择不同的打印函数来指定是否添加引用字符。

如果文本需要重新读入 Lisp 中,则应使用引用字符进行打印以避免歧义。 同理,如果目的是为 Lisp 程序员清晰描述一个 Lisp 对象,也应如此。 但如果输出的目的是为了让人类阅读时更美观,通常最好不使用引用字符打印。

Lisp 对象可以引用自身。以常规方式打印自引用对象会需要无限量的文本, 且尝试这样做可能导致无限递归。Emacs 会检测此类递归,并打印 ‘#level’ 而非递归打印已在打印过程中的对象。例如,此处 ‘#0’ 表示对当前打印操作 第 0 层对象的递归引用:

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

以下函数中,stream 代表输出流(output stream)。 (输出流的相关描述参见上一节,另可参见 See external-debugging-output, 这是一个用于调试的实用流值。) 如果 streamnil 或被省略,则默认使用 standard-output 的值。

Function: print object &optional stream

print 函数是一种便捷的打印方式。它会将 object 的打印表示形式输出到 stream, 并在 object 之前额外打印一个换行符,之后再打印一个换行符。 该函数会使用引用字符,并返回 object。例如:

(progn (print 'The\ cat\ in)
       (print "the hat")
       (print " came back"))
     ⊣
     ⊣ The\ cat\ in
     ⊣
     ⊣ "the hat"
     ⊣
     ⊣ " came back"
     ⇒ " came back"
Function: 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"

如果 overridesnil,则其值应为 t(表示让 prin1 使用所有打印相关变量的默认值)或一个设置列表。See 覆盖输出变量

Function: princ object &optional stream

该函数将 object 的打印表示形式输出到 stream,并返回 object

此函数旨在生成人类可读的输出,而非供 read 函数读取的输出, 因此它不会插入引用字符,也不会在字符串内容两侧添加双引号。 多次调用该函数时,函数之间不会添加任何空格。

(progn
  (princ 'The\ cat)
  (princ " in the \"hat\""))
     ⊣ The cat in the "hat"
     ⇒ " in the \"hat\""
Function: terpri &optional stream ensure

该函数向 stream 输出一个换行符。函数名是 “terminate print” 的缩写。 如果 ensurenil,且 stream 已处于行首,则不会打印换行符。 请注意,此种情况下 stream 不能是函数,否则会触发错误。 如果打印了换行符,该函数返回 t

Function: write-char character &optional stream

该函数将 character 输出到 stream,并返回 character

Function: flush-standard-output

如果你编写了基于 Emacs 的批处理脚本并向终端发送输出, 那么每当你向 standard-output 写入换行符时,Emacs 会自动显示输出内容。 该函数允许你无需先发送换行符即可刷新 standard-output, 从而能够显示不完整的行。

Function: prin1-to-string object &optional noescape overrides

该函数返回一个字符串,其中包含 prin1 函数对相同参数本应打印的文本内容。

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

如果 overridesnil,则其值应为 t(表示让 prin1
使用所有打印相关变量的默认值)或一个设置列表。详情请参见 See 覆盖输出变量

如果 noescapenil,则会禁止在输出中使用引用字符。 (Emacs 19 及更高版本支持该参数。)

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

如需通过其他方式获取 Lisp 对象的打印表示形式并转换为字符串, 请参见 格式化字符串 中的 format 函数。

Macro: with-output-to-string body…

该宏会执行 body 形式,并将 standard-output 配置为将输出写入字符串。 执行完成后,宏会返回该字符串。

例如,如果当前缓冲区(buffer)名称为 ‘foo’:

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

上述代码会返回 "The buffer is foo"

Function: pp object &optional stream

该函数将 object 输出到 stream,行为与 prin1 类似, 但输出格式更美观。具体来说,它会对对象进行缩进和填充,使其更易于人类阅读。

如果你需要在批处理模式下使用二进制 I/O(例如,使用本节描述的函数写入任意二进制数据, 或在非 POSIX 主机上避免换行符转换),请参见 set-binary-mode


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike