为什么在emacs lisp中的'let`之后有两个括号?

Hat*_*sut 6 emacs elisp parentheses

我正在做关于emacs lisp 的教程,它正在谈论这个let功能.

;; You can bind a value to a local variable with `let':
(let ((local-name "you"))
  (switch-to-buffer-other-window "*test*")
  (erase-buffer)
  (hello local-name)
  (other-window 1))
Run Code Online (Sandbox Code Playgroud)

我不明白let第一行后双括号的作用.他们在做什么,一套不会做?没有它们运行该部分,我收到一个错误:Wrong type argument: listp, "you".

Sva*_*nte 10

你可以在那里引入多个变量.外部括号分隔绑定列表,内部是单个绑定表单.

(let ((foo "one")
      (bar "two"))
  (frobnicate foo bar))
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!为什么我们不需要单引号'(...)用于该varlist,而在其他情况下我们确实需要'(...)来制作一个列表? (2认同)
  • @Hatshepsut:`let`是一种特殊形式,有自己的评估规则.引用表单仅适用于包含表单的评估规则否则会尝试对其进行评估的情况.特殊表单通常设计有合理的评估规则,可以最大限度地减少语法. (2认同)

Dre*_*rew 6

没有双括号”。

想必,你在想(let ((foo...)...)),你的意思((是后面的let?如果是这样,请考虑:

(let (a b c) (setq a 42)...)
Run Code Online (Sandbox Code Playgroud)

IOW,let 声明局部变量。它可能结合他们。在前面的 sexp 中,它声明了a,bc,但它没有绑定它们中的任何一个,而是将它留给let主体来为它们赋值。

声明两个变量但仅绑定其中一个变量 ( a)的示例:

(let ((a 42) b) ... (setq b ...) ...)
Run Code Online (Sandbox Code Playgroud)