动态作用域中的形式参数和自由变量
Formal parameters and free variables in dynamic scoping
我对动态作用域有些困惑,特别是当形式参数和自由变量共享一个名称时会发生什么。
例如
(define x 1)
(define f (lambda (x) x) )
(f 2)
如果使用动态范围编译和评估此代码,输入是什么? 2 还是 3?
虽然看起来参数的赋值 (x = 2) 最多 'recent' 所以它应该是 '2',有些人告诉我答案是 1(而其他人说它是 2 .大家一头雾水).
{我知道 scheme 并且大多数语言都使用词法范围,但请告诉我的教授}
如果能得到任何帮助,我将不胜感激。
没有动态范围。它是“词法范围”或“动态范围”。但是,撇开这个不谈,它是 2:
(f 2)
=
( (lambda (x) x) 2 )
=
(begin (set! old-x x) ; save old value of formal param
(set! x 2) ; set param to argument's value
(set! return-value ; evaluate the body
x) ; and save the result
(set! x old-x) ; restore the param's old value
return-value ) ; return the result
翻译必须始终使用唯一的临时变量名称,以防止混淆。这里是 old-x
和 return-value
,但它可以是翻译后的程序代码中未在其他任何地方使用的任何名称。
我对动态作用域有些困惑,特别是当形式参数和自由变量共享一个名称时会发生什么。
例如
(define x 1)
(define f (lambda (x) x) )
(f 2)
如果使用动态范围编译和评估此代码,输入是什么? 2 还是 3?
虽然看起来参数的赋值 (x = 2) 最多 'recent' 所以它应该是 '2',有些人告诉我答案是 1(而其他人说它是 2 .大家一头雾水).
{我知道 scheme 并且大多数语言都使用词法范围,但请告诉我的教授}
如果能得到任何帮助,我将不胜感激。
没有动态范围。它是“词法范围”或“动态范围”。但是,撇开这个不谈,它是 2:
(f 2)
=
( (lambda (x) x) 2 )
=
(begin (set! old-x x) ; save old value of formal param
(set! x 2) ; set param to argument's value
(set! return-value ; evaluate the body
x) ; and save the result
(set! x old-x) ; restore the param's old value
return-value ) ; return the result
翻译必须始终使用唯一的临时变量名称,以防止混淆。这里是 old-x
和 return-value
,但它可以是翻译后的程序代码中未在其他任何地方使用的任何名称。