4.4.2 append-to-buffer 的函数体

append-to-buffer 的函数体以 let 开头。

如前所述(see let),let 表达式的作用是创建一个或多个变量并赋予初始值,这些变量仅在 let 函数体内有效。这意味着该变量不会与 let 表达式外部同名变量冲突。

通过展示包含 let 表达式的 append-to-buffer 概要模板,可以清晰看出 let 在整个函数中的位置:

(defun append-to-buffer (buffer start end)
  "documentation..."
  (interactive ...)
  (let ((variable value))
        body...))

let 表达式包含三个部分:

  1. 符号 let
  2. 变量列表,本例中为单个双元素列表 (variable value)
  3. let 表达式的函数体。

append-to-buffer 函数中,变量列表如下:

(oldbuf (current-buffer))

let 表达式的这一部分中,变量 oldbuf 被绑定到 (current-buffer) 表达式的返回值。变量 oldbuf 用于记录当前工作的源缓冲区。

变量列表的元素被一对括号包裹,以便 Lisp 解释器区分变量列表与 let 函数体。因此,变量列表内的双元素列表又被外层括号包裹。该行代码如下:

(let ((oldbuf (current-buffer)))
  ... )

如果你没有意识到 oldbuf 前的第一个括号标记变量列表边界、第二个括号标记双元素列表 (oldbuf (current-buffer)) 开头,可能会对这两个连续括号感到意外。