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

时间:2015-09-26 21:19:51

标签: emacs elisp parentheses

我在emacs lisp上做tutorial,它正在讨论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))

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

4 个答案:

答案 0 :(得分:10)

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

#include "addpoint.h"

AddPoint::AddPoint(QWidget *parent) :QDialog(parent)
{
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

    createButton();

    connect(OKButton, SIGNAL(clicked(bool)), this, SLOT(accept()));

    setMinimumSize(320, 240);
}

/**/
void AddPoint::createButton()
{
    XpointL = new QLabel("Point X:", this);
    XpointL->setFixedSize(100, 30);
    XpointL->move(10, 10);

    XPoint = new QLineEdit(this);
    XPoint->setFixedSize(180, 30);
    XPoint->move(120, 10);

    OKButton = new QPushButton("OK", this);
    OKButton->setFixedSize(100, 30);
    OKButton->move(200, 150);

}

答案 1 :(得分:4)

double parens ”。

据推测,您正在考虑(let ((foo...)...)),您的意思是((之后的let?如果是这样,请考虑一下:

(let (a b c) (setq a 42)...)

IOW,let 声明 本地变量。 可能 绑定 。在之前的sexp中,它声明abc,但它不绑定任何一个,将它留给let正文给它们值

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

(let ((a 42) b) ... (setq b ...) ...)

答案 2 :(得分:2)

根据gnu.org,看起来你可以用一个let语句构造和初始化多个变量,所以双括号是允许变量之间的分离。

  

如果varlist由两个元素列表组成,通常就是这种情况,let表达式的模板如下所示:

(let ((variable value)
      (variable value)
      …)
  body…)

答案 3 :(得分:2)

let特殊表单采用绑定列表:(let (<binding-form> ...) <body>)

绑定表单是<symbol>(表示绑定到值nil的变量)或列表(<symbol> <value>)之一(其中值是在输入let时计算的)。

letlet*之间的差异是“值”位的执行方式。对于普通let,它们在任何值绑定之前执行:

(let ((a 17) 
      (b 42)) 
  (let ((a b)  ; Inner LET
        (b a)) 
    (list a b)))

let*一个接一个地执行绑定表单。两者都有自己的位置,但只能使用let,因为(let* (<form1> <form2>...)相当于(let (<form1>) (let (<form2>) ...))