我在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"
。
答案 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中,它声明a
,b
和c
,但它不绑定任何一个,将它留给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
时计算的)。
let
和let*
之间的差异是“值”位的执行方式。对于普通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>) ...))