2013-02-18 40 views
5

所以我知道,在方案定義是動態作用域並讓靜態範圍,但下面的事情讓我困惑:計劃作用域(定義和讓)

如果我有

(let ((x 0)) 
    (define f (lambda() x)) 
    (display (f)) 
    (let ((x 1)) 
    (display (f)) 
    ) 
) 

它將顯示00.到目前爲止很好。但是,如果我爲x添加額外的定義,如下所示:

(let ((x 0)) 
    (define f (lambda() x)) 
    (display (f)) 
    (define x 4) 
    (let ((x 1)) 
    (display (f)) 
    ) 
) 

它將顯示undefined4。爲什麼是這樣?後爲什麼x限定評估˚F影響(F)的返回值?爲什麼返回值是「undefined」?

還值得一提的是,隨着letrec代替結合˚F定義也將工作:

(let ((x 0)) 
    (letrec ((f (lambda() x))) 
    (display (f)) 
    (define x 4) 
    (let ((x 1)) 
    (display (f)) 
    ) 
) 
) 

返回00

注:我已經使用DrRacket與「漂亮的大」設置languge

+2

你是什麼意思「定義爲動態範圍界定方案」?順便說一句,除非你被要求使用它的課程,「漂亮大」是一個過時的方言。 – Rhangaun 2013-02-18 23:12:27

+3

Scheme總是使用靜態作用域,這是不正確的,說「定義是動態的,讓靜態作用域」 – 2013-02-18 23:16:45

+0

我同意奧斯卡:問題的前提是錯誤的,或者是使用錯誤的術語。 – dyoo 2013-02-19 05:19:56

回答

0

情況1:f的體結合到二者調用最外讓,導致00作爲靜態範圍需要。案例2:我對此不太確定,但內部的(define x 4)影響了最外層的x = 0綁定,並且在範圍內,儘管它在調用f後是在文本上。然後評價trickiness的一些命令,使新的X結合完全初始化前的第一次調用發生,所以它的「初始化」。在內部讓第二個呼叫發生的一切初始化後,讓4

案例3:現在,我們已經明確地把letrec和單獨的範圍的定義,F顯然指的是最外面的讓利。定義在這裏沒有做任何事。

5

你在第二種情況下遇到的問題是,(define x 42)使x在其中它的定義整個範圍的變量。現在,雖然變量爲整個範圍來限定,其是未定義的,直到實際(define x 42)線。

(let() 
    ;; up here, `x` is defined but has an undefined value 
    ;; ... 
    (define x 42) 
    ;; down here `x` has the value 42 
    ;; ... 
) 

它的作用更多的是這樣的:

(let ([x 'undefined]) 
    ;; ... up here, `x` is 'undefined 
    (set! x 42) 
    ;; ... down here, `x` is 42 
) 
+0

Bun哪裏去'let((x 0))'在頂部? – Necto 2013-02-25 05:02:29

1

你的第二個和第三個代碼片段並不計劃(無R5RS,R6RS也不R7RS的)。 (的let和其他)<body>定義爲:

<body> -> <definition>* <sequence> 
<sequence> -> <command>* <expression> 
<command> -> <expression> 

因而define(這是一個<definition>不能遵循display(一個<expression>)。您可能會因爲編譯器/解釋器錯誤地處理'let'的擴展而導致混淆結果。

下面是一個「好」 R6RS編譯器:

> (let ((x 0)) 
    (letrec ((f (lambda() x))) 
    (display (f)) 
    (define x 4) 
    (let ((x 1)) 
    (display (f)) 
    ) 
) 
) 
Unhandled exception 
Condition components: 
    1. &who: define 
    2. &message: "a definition was found where an expression was expected" 
    3. &syntax: 
     form: (define x 4) 
     subform: #f 
    4. &trace: #<syntax (define x 4)> 
> 
+0

你使用什麼編譯器? – Necto 2013-02-25 05:05:04

+0

Ikarus(http://en.wikipedia.org/wiki/Ikarus_(Scheme_implementation)) – GoZoner 2013-02-25 05:30:32