2014-08-27 58 views
1

我學習了Emacs Lisp,因爲我想定製我的編輯器並且很清楚我對動態綁定的工作原理有點困惑。「let」綁定不適用於後續的「let」綁定?

這裏是例子:

(setq y 2)  

(let ((y 1) 
     (z y)) 
    (list y z)) 

    ==> (1 2) 

結果我回來=>(1 2) 請一些能解釋一個究竟怎麼回事。我試圖用自己的框架來解釋這個框架,其中每個框架創建本地綁定,但它看起來像在這裏以不同的方式工作。

爲什麼它沒有在最近的框架中取最接近的'y'值?

如果能夠詳細描述這裏發生了什麼,我會非常高興。

在此先感謝。缺口。

+0

我編輯的問題標題。這與動態綁定沒有任何特別的關係。 – Drew 2014-08-27 15:34:47

回答

6

在的Emacs Lisp(如在許多的Lisp),將在let綁定的值計算並行地,在「外部」環境中的let

作爲一個例子,下面是(約)相當於:

(let ((a b) 
     (b a)) 
    ...) 

=> 

(funcall (lambda (a b) ...) b a) 

如果你要綁定順序的事情,你應該使用let*,這不符合您的預期let做。

+0

尼斯細微的答案。 – 2014-08-27 13:13:55

1

您設置的y的值只允許在let的body中生效,但當您在同一個let語句中設置z時,該值尚未生效。

2

如果使用let*它允許你使用let -mentioned瓦爾的問題就解決了:

(setq y 2)  

(let* ((y 1) 
     (z y)) 
    (list y z)) 

    ==> (1 1) 
3

你的例子似乎是直接從Emacs Lisp Reference。如果您向下滾動到let*,你會得到的解釋:

這種特殊的形式是像讓,但它 計算它的局部值後,結合每個變量正確,計算當地的價值,爲 下一個變量之前。因此,綁定中的表達式可以引用在此let *形式中綁定的前面的符號。以上爲讓例子比較下面 例如:

(setq y 2) 
⇒ 2 

(let* ((y 1) 
     (z y)) ; Use the just-established value of y. 
    (list y z)) 
⇒ (1 1) 
+0

是的,我做過了,我的意思是從Emacs Lisp Reference作爲最直接的一個。 – SuperManEver 2014-08-27 12:23:23