在期望一切顺利的情况下评估的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-append
和kill-new
函数如何处理添加到文本中的属性,例如粗体或斜体。
last-command
是Emacs附带的一个我们之前没有见过的变量。通常,每当执行函数时,Emacs都会将last-command
的值设置为前一个命令。
在这个定义片段中,if
表达式检查前一个命令是否为kill-region
。如果是,
(kill-append string (< end beg) yank-handler)
将新剪贴文本的副本连接到刚刚剪贴的文本在kill ring中。