2015-09-26 39 views
4

我正在做一個tutorial emacs lisp,它是在談論let函數。爲什麼在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)) 

我不明白在第一行let後面的雙括號的作用。他們在做什麼,一套不會做?沒有它們運行該部分,我得到一個錯誤:Wrong type argument: listp, "you"

回答

8

你可以在那裏引入多個變量。外部圓括號界定了綁定列表,即單個綁定表單的內部。

(let ((foo "one") 
     (bar "two")) 
    (frobnicate foo bar)) 
+2

謝謝!爲什麼我們不需要單引號(...)來表示這個varlist,而在其他情況下我們確實需要'(...)來創建一個列表? – Hatshepsut

+2

@Hatshepsut:'let'是一種特殊的形式,它有自己的評估規則。引用表單僅適用於包含表單的評估規則將以其他方式嘗試對其進行評估的情況。特殊形式通常設計有明智的評估規則,可以最大限度地減少額外的語法 – Svante

2

gnu.org,它看起來像你可以構建和一個let語句初始化多個變量,因此雙括號是有允許變量之間的分離。

If the varlist is composed of two-element lists, as is often the case, the template for the let expression looks like this:

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

雙括號」。

想必你是想到(let ((foo...)...)),而你的意思是之後的((?如果是的話,考慮一下:

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

督察,let聲明局部變量。它可能綁定他們。在之前的sexp中,它聲明瞭a,bc,但它不綁定任何一個,而是將其留給let主體以賦予它們值。

聲明兩個變量,但其中只有一個(a)結合的一個例子:

(let ((a 42) b) ... (setq b ...) ...) 
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>) ...))

相關問題