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
以副作用的方式打印文本,没有引号。)