8.1.4 progn 特殊形式

progn 是一种特殊形式,它会按顺序依次求值其每一个参数, 并返回最后一个参数的值。前面的表达式仅为执行它们产生的副作用而求值, 这些表达式生成的值会被直接丢弃。

progn 表达式的模板非常简单:

(progn
  body...)

zap-to-char 中,progn 表达式需要完成两件事: 将光标精确定位到正确位置;并返回光标位置, 以便 kill-region 知道需要删除到何处为止。

progn 的第一个参数是 search-forward。 当 search-forward 找到目标字符串时,该函数会将光标置于 目标字符串最后一个字符的紧后方。(本例中目标字符串仅有一个字符长度。) 如果是反向搜索,search-forward 会将光标置于目标字符串 第一个字符的紧前方。光标的移动属于副作用。

progn 的第二个也是最后一个参数是表达式 (point)。 该表达式会返回当前光标位置的值,在本例中即为被 search-forward 移动后的光标位置。(在源码中,有一行用于让函数在向前搜索时回退到前一个字符的代码 已于 1999 年被注释;我已不记得这一功能或缺陷是否曾出现在发布版源码中。) progn 表达式会返回 point 的值,并将其作为 kill-region 的第二个参数传入。