什么?意思是 (insert "hello" ?\s "world" ?\n)

What does ? mean in (insert "hello" ?\s "world" ?\n)

函数insert示例演示如下:

(with-temp-buffer
  (insert "hello" ?\s "world" ?\n)
  (buffer-string))

这里的?是什么意思?

?\s?\n 字符 的读取语法。第一个是 space 字符的读取语法;第二个字符 NEWLINE(也称为 Control J,有时显示为 ^J,其中 ^J 是换行符。

在 Emacs Lisp 中,字符是正整数。它们可以写成 ASCII 码(值)的数字,当这样写时,它们可以被 Lisp reader 读取:32(对于 \s)和 10 (对于 \n)。但是 Elisp 还提供了 ? 引入的字符读取语法,这两个字符有自己的 ? 语法。其他更普通的字符可以只用?作为前缀:?s读作字符s?@读作字符@

? 读取语法比仅使用整数 对于人类 更具可读性:115(对于 ?s)和 64 对于 ?@。但您始终可以只使用整数——字符 整数。

您的示例:(insert "hello" ?\s "world" ?\n)。函数 insert 接受字符串和字符作为其参数。在这种情况下,您传递字符串 "hello"、字符 ?\s(space 字符)、字符串 "world" 和字符 ?\n(换行符,Control J)。

参见 Elisp 手册,节点 Basic Char Syntax