动态范围内的形式参数和自由变量

问题描述

我对动态范围有些困惑,特别是当形参和自由变量共享一个名称时会发生什么。

例如

(define x 1)
(define f (lambda (x) x) )
(f 2)

如果使用动态范围来编译和评估此代码,那么输入是什么? 2 还是 3?

虽然参数的赋值 (x = 2) 似乎是“最近的”,所以它应该是“2”,但有些人告诉我答案是 1(而其他人说是 2。每个人都很困惑).

{我知道方案和大多数语言都使用词法范围,但告诉我的教授}

如果我能得到任何帮助,我将不胜感激。

解决方法

没有动态范围。它是“词法范围”或“动态范围”。但是,把它放在一边,它是 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-xreturn-value,但它可以是任何未在已翻译程序代码中的其他任何地方使用的名称。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...