在谈到词法作用域和动态作用域之间的区别后,我的教授给了我们一个问题。他向我们展示了一个用 Haskell 编码的简单求值器(一种虚构的语言)。以下是代码:
type Var = ...
type Env = ...
data Val = Vnum Int
| Vfun Var Exp
data Exp = Enum Int
| Evar Var
| Efun Var Exp
| Ecall Exp Exp
| Elet Var Exp Exp
-- Predefined. Find the correspondent value of a variable
env_lookup :: Env -> Var -> Val
...
-- Predefined. Add the variable and its associated value to the environment
env_add :: Env -> Var -> Val -> Env
...
eval env (Enum n) = Vnum n
eval env (Evar x) = env_lookup x env
eval env (Ecall fun actual)
= case (eval env fun) of
Vnum n -> error "Not a Function!"
Vfun formal body ->
eval (env_add env formal (eval env actual)) body
-- To be completed --
问题问:
这种实现的语言是使用词法作用域还是动态作用域?以及我们应该如何更改代码以使其具有另一种类型的范围
坦率地说,这是一个非常难的问题。从代码中很容易看出,这种语言是实现“按名称调用”还是“按值调用”(在本例中为“按值调用”)。但是分析它是动态作用域还是词法作用域是另一回事