condition-case 表达式中预期正常执行的部分
包含一个 when 结构。代码通过 when
判断 string 变量是否指向有效文本。
when 表达式只是为编程提供便利,
等价于不包含 else 分支的 if。
你可以直接将 when 替换为 if 来理解逻辑,
Lisp 解释器也是如此处理的。
严格来说,when 是一个 Lisp 宏。
Lisp 宏允许你定义新的控制结构与其他语言特性,
它告知解释器如何生成另一段 Lisp 表达式,
再由该表达式完成最终求值。此处对应的表达式即为 if。
kill-region 函数定义中还包含 unless 宏,
其逻辑与 when 相反。unless 宏
类似于没有 then 分支的 if,并隐式返回 nil。
如需了解更多 Lisp 宏相关内容,可参考 Macros in The GNU Emacs Lisp Reference Manual。C 语言同样提供宏, 二者实现不同,但都十分实用。
关于 when 宏,在 condition-case 表达式中,
若字符串包含内容,则会执行另一个条件表达式,
这是一个同时包含 then 分支与 else 分支的 if。
(if (eq last-command 'kill-region)
(kill-append string (< end beg) yank-handler)
(kill-new string nil yank-handler))
若上一条命令同样为 kill-region,
则执行 then 分支;否则执行 else 分支。
yank-handler 是 kill-region 的可选参数,
用于告知 kill-append 和 kill-new 函数
如何处理文本附加的属性,例如粗体或斜体。
last-command 是 Emacs 内置变量,我们此前尚未接触。
通常每当函数执行时,Emacs 都会将 last-command
的值设为上一条执行的命令。
在该段定义中,if 表达式判断
上一条命令是否为 kill-region。若是,
(kill-append string (< end beg) yank-handler)
会将新剪切的文本副本追加到删除环中上一次剪切的文本之后。