2013-02-18 57 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