8.2.2 Lisp macro

在期望一切顺利的情况下评估的condition-case表达式的一部分具有when。该代码使用when来确定string变量是否指向存在的文本。

when表达式只是程序员的便利。它是一个没有else子句可能性的if。在你的脑海中,你可以用if替换when并理解发生了什么。这就是Lisp解释器所做的。

从技术上讲,when是一个Lisp宏。Lisp宏使您能够定义新的控制结构和其他语言功能。它告诉解释器如何计算另一个Lisp表达式,该表达式将进而计算值。在这种情况下,另一个表达式是一个if表达式。

kill-region函数定义还有一个unless宏;它是when的反义词。unless宏是一个没有then子句的if

有关Lisp宏的更多信息,请参阅Macros in The GNU Emacs Lisp Reference Manual。C编程语言也提供宏。它们是不同的,但同样有用。

关于when宏,在condition-case表达式中,当字符串具有内容时,然后执行另一个条件表达式。这是一个带有then-part和else-part的if

(if (eq last-command 'kill-region)
    (kill-append string (< end beg) yank-handler)
  (kill-new string nil yank-handler))

如果前一个命令是另一个对kill-region的调用,则评估then-part;否则,评估else-part。

yank-handler是传递给kill-region的可选参数,告诉kill-appendkill-new函数如何处理添加到文本中的属性,例如粗体或斜体。

last-command是Emacs附带的一个我们之前没有见过的变量。通常,每当执行函数时,Emacs都会将last-command的值设置为前一个命令。

在这个定义片段中,if表达式检查前一个命令是否为kill-region。如果是,

(kill-append string (< end beg) yank-handler)

将新剪贴文本的副本连接到刚刚剪贴的文本在kill ring中。