3.3.1 交互式 multiply-by-seven 详解

让我们看一下特殊形式 interactive 的使用,然后再看一下multiply-by-seven 的交互版本中的函数 message。你会记得该函数定义如下:

(defun multiply-by-seven (number)       ; 交互版本。
  "将 NUMBER 乘以七。"
  (interactive "p")
  (message "结果是 %d" (* 7 number)))

在这个函数中,表达式 (interactive "p") 是一个包含两个元素的列表。"p" 告诉 Emacs 将前缀参数传递给函数,并将其值用作函数的参数。

参数将是一个数字。这意味着在以下行中,符号number 将绑定到一个数字:

(message "结果是 %d" (* 7 number))

例如,如果你的前缀参数是 5,Lisp 解释器将将该行解释为:

(message "结果是 %d" (* 7 5))

(如果你在 GNU Emacs 中阅读此文,你可以自行评估这个表达式。)首先,解释器将评估内部列表,即 (* 7 5)。这将返回一个值为 35。接下来,它将评估外部列表,将列表的第二个和随后的元素的值传递给函数 message

正如我们所见,message 是一个专为向用户发送单行消息而设计的 Emacs Lisp 函数。(See The message function.)总体而言,message 函数会将其第一个参数原样打印在回显区域,但会替换‘%d’ 或 ‘%s’(以及我们未提及的其他各种 %-sequences)的出现。当它看到控制序列时,该函数会查找第二个或随后的参数,并在字符串中的控制序列位置打印参数的值。

在交互式 multiply-by-seven 函数中,控制字符串是 ‘%d’,需要一个数字,而通过评估 (* 7 5) 返回的值是数字 35。因此,数字 35 将在 ‘%d’ 的位置打印,消息为 ‘结果是 35’。

(请注意,当调用函数 multiply-by-seven 时,消息会以无引号形式打印,但调用 message 时,文本将以双引号形式打印。这是因为 message 返回的值是在评估其第一个元素为 message 的表达式时出现在回显区域中的内容;但在嵌入函数中时,message 以副作用的方式打印文本,没有引号。)