multiply-by-seven 详解 ¶我们来详细看交互式版本 multiply-by-seven 中 interactive 特殊形式和 message 函数的用法。函数定义如下:
(defun multiply-by-seven (number) ; Interactive version.
"Multiply NUMBER by seven."
(interactive "p")
(message "The result is %d" (* 7 number)))
在这个函数中,表达式 (interactive "p") 是一个含两个元素的列表。"p" 告诉 Emacs 把前缀参数传递给函数,并将其值作为函数的参数。
该参数是一个数字,意味着符号 number 会在下面这行中绑定到一个数值:
(message "The result is %d" (* 7 number))
例如,如果前缀参数是 5,Lisp 解释器会把这行等价于:
(message "The result is %d" (* 7 5))
(如果你在 GNU Emacs 中阅读,可以自己对这个表达式求值。)首先,解释器会对内层列表 (* 7 5) 求值,得到 35。接着对外层列表求值,将列表第二个及后续元素的值传递给 message 函数。
我们已经知道,message 是 Emacs Lisp 中专门用于向用户输出单行信息的函数。(See message 函数。简单来说,message 会在回显区原样打印第一个参数,遇到 ‘%d’ 或 ‘%s’(以及其他未介绍的 % 格式符)时,会用后续参数的值替换对应位置。
在交互式版本 multiply-by-seven 中,格式符是 ‘%d’,要求传入数字;而 (* 7 5) 求值结果为 35,因此数字 35 会替换 ‘%d’,最终显示为 ‘结果是 35’。
(注意:直接调用 multiply-by-seven 时,消息不带引号;而直接调用 message 表达式时,文本会带双引号显示。原因是:直接对以 message 开头的表达式求值时,回显区显示的是其返回值;而当 message 嵌在函数内部时,它以副作用形式打印文本,不会带引号。)