本节描述用于打印 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,
这是一个用于调试的实用流值。)
如果 stream 为 nil 或被省略,则默认使用 standard-output 的值。
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"
该函数将 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
使用所有打印相关变量的默认值)或一个设置列表。See 覆盖输出变量。
该函数将 object 的打印表示形式输出到 stream,并返回 object。
此函数旨在生成人类可读的输出,而非供 read 函数读取的输出,
因此它不会插入引用字符,也不会在字符串内容两侧添加双引号。
多次调用该函数时,函数之间不会添加任何空格。
(progn
(princ 'The\ cat)
(princ " in the \"hat\""))
⊣ The cat in the "hat"
⇒ " in the \"hat\""
该函数向 stream 输出一个换行符。函数名是 “terminate print” 的缩写。
如果 ensure 非 nil,且 stream 已处于行首,则不会打印换行符。
请注意,此种情况下 stream 不能是函数,否则会触发错误。
如果打印了换行符,该函数返回 t。
该函数将 character 输出到 stream,并返回 character。
如果你编写了基于 Emacs 的批处理脚本并向终端发送输出,
那么每当你向 standard-output 写入换行符时,Emacs 会自动显示输出内容。
该函数允许你无需先发送换行符即可刷新 standard-output,
从而能够显示不完整的行。
该函数返回一个字符串,其中包含 prin1 函数对相同参数本应打印的文本内容。
(prin1-to-string 'foo)
⇒ "foo"
(prin1-to-string (mark-marker))
⇒ "#<marker at 2773 in strings.texi>"
如果 overrides 非nil,则其值应为t(表示让prin1使用所有打印相关变量的默认值)或一个设置列表。详情请参见 See 覆盖输出变量。
如果 noescape 非 nil,则会禁止在输出中使用引用字符。
(Emacs 19 及更高版本支持该参数。)
(prin1-to-string "foo")
⇒ "\"foo\""
(prin1-to-string "foo" t)
⇒ "foo"
如需通过其他方式获取 Lisp 对象的打印表示形式并转换为字符串,
请参见 格式化字符串 中的 format 函数。
该宏会执行 body 形式,并将 standard-output 配置为将输出写入字符串。
执行完成后,宏会返回该字符串。
例如,如果当前缓冲区(buffer)名称为 ‘foo’:
(with-output-to-string (princ "The buffer is ") (princ (buffer-name)))
上述代码会返回 "The buffer is foo"。
该函数将 object 输出到 stream,行为与 prin1 类似,
但输出格式更美观。具体来说,它会对对象进行缩进和填充,使其更易于人类阅读。
如果你需要在批处理模式下使用二进制 I/O(例如,使用本节描述的函数写入任意二进制数据, 或在非 POSIX 主机上避免换行符转换),请参见 set-binary-mode。