(let ((a 3))
(let ((a 4)
(b a))
(+ a b)))
上述代碼求值爲7,邏輯是b取值爲a
。根據我的理解,在詞彙綁定中,每個'let'的使用都會創建一個新的位置。那麼爲什麼(b a)
聲明中的變量b
未使用(a 4)
中的值a
?Lisp中的詞法綁定
(let ((a 3))
(let ((a 4)
(b a))
(+ a b)))
上述代碼求值爲7,邏輯是b取值爲a
。根據我的理解,在詞彙綁定中,每個'let'的使用都會創建一個新的位置。那麼爲什麼(b a)
聲明中的變量b
未使用(a 4)
中的值a
?Lisp中的詞法綁定
因爲這就是LET
指定要做的事情。綁定在並行完成。
CL-USER 60 > (let ((a 3))
(let ((a 4)
(b a))
(+ a b)))
7
版本,其中綁定在順序方式進行的被稱爲LET*
。
CL-USER 61 > (let ((a 3))
(let* ((a 4)
(b a))
(+ a b)))
8
(let ((a 4)
(b a))
(+ a b)) ; ==> 7
等價於寫作:
((lambda (a b)
(+ a b))
4
a) ; ==> 7
你從這個版本,它的邏輯,a
和b
是4
和a
評價後必然看到了什麼?
現在我們有:
(let* ((a 4)
(b a))
(+ a b)) ; ==> 8
這相當於:
(let ((a 4))
(let ((b a))
(+ a b))) ; ==> 8
這裏第二let
是第一主體。當評估b
的表達式時,a
是4
。
我們究竟是什麼意思的詞彙環境的名稱?它是否涉及其範圍? – Hubble 2014-12-07 16:21:50
@ hubble基本上,是的。詞彙環境適用於所有實際用途,與詞彙範圍相同。動態環境依賴於執行時的精確調用路徑。 – Vatine 2014-12-10 18:01:39