【问题标题】:What is the 'message return type please?请问'消息返回类型是什么?
【发布时间】:2012-09-04 19:44:02
【问题描述】:

我正在关注 elisp 的介绍。非常第一章。这是我从 html 书中复制/粘贴的两个示例。我已经评估了这两种形式,在这里我从 *Messages* 缓冲区复制/粘贴返回值和输出作为副作用(我不知道如何复制迷你缓冲区内容)。

第一种形式

(let ((zebra 'stripes)
      (tiger 'fierce))
  (message "One kind of animal has %s and another is %s."
           zebra tiger))

来自 *Messages* 的输出

One kind of animal has stripes and another is fierce.
#("One kind of animal has stripes and another is fierce." 23 30 (fontified t))

第二种形式

(let ((birch 3)
      pine
      fir
      (oak 'some))
  (message "Here are %d variables with %s, %s and %s value."
           birch pine fir oak))

*Messages* 的输出是:

Here are 3 variables with nil, nil and some value.
"Here are 3 variables with nil, nil and some value."

为什么第一个表单返回一个 lambda 值? 是什么让第一种形式如此特别以至于返回的值不会是字符串?

【问题讨论】:

    标签: emacs elisp let


    【解决方案1】:

    message 返回类型只是一个字符串。在*Messages* 缓冲区中,您既可以看到message 的返回值(由评估命令显示在回显区域的引号中),也可以看到message 本身在回显区域中显示的未引用字符串。第一个结果不是 lambda,而是带有文本属性的字符串。

    在 Emacs 中,字符串对象的可打印表示通常是双引号中的内容,如您的第二个示例所示。但是,附加了文本属性的字符串以更复杂的方式打印,如#("...string contents..." start end (property value...) ...)。这种扩展语法是为了让 Lisp 阅读器能够在从其文本表示中读回字符串时重新创建属性。您可以通过在新缓冲区中评估 M-: (insert #("foo" 0 3 (face (:foreground "yellow")))) 来测试这一点 - 文本将显示为黄色,因为字符串本身包含将其绘制为黄色的指令。 (要看到这一点,您需要在使用 C-x b randomname RET 获得的新缓冲区中 - 它不适用于 *scratch* 等语法突出显示的缓冲区,因为它们本身会为文本着色。)

    所以,您打印的第一个字符串带有附加属性,可能是复制和粘贴的产物,这就是它打印为#("..." ...) 的原因。第二个字符串没有属性,可以打印为一个简单的字符串。

    Emacs Lisp manual 包含更多关于文本属性的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-04
      • 2015-12-08
      • 2018-01-17
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      相关资源
      最近更新 更多