微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

词法或动态范围 - Haskell 实现的评估器

如何解决词法或动态范围 - Haskell 实现的评估器

我的教授在讨论了词法作用域和动态作用域之间的区别后给了我们一个问题。他向我们展示了一个用 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 --

问题问:

这个实现的语言是使用词法作用域还是动态作用域?我们应该如何更改代码以使其具有另一种类型的作用域

坦率地说,这是一个非常难的问题。从代码中很容易看出,这种语言是实现“按名称调用”还是“按值调用”(在这种情况下,它是“按值调用”)。但是分析它是动态作用域还是词法作用域是另一回事

解决方法

您的代码不完整:

eval env (Ecall fun actual)
  = case fun of
     Vnum n -> error "Not a Function!"
     Vfun formal body ->
           eval (env_add env formal (eval     actual)) body
                                         ^^^^^

缺少一个参数。但是您只有一种选择来修复它,即在那里添加 env

那么意思就变成了,在用参数和参数对扩展的环境 env 中评估 body。

当前环境,env。不是函数创建时的那个。

这意味着动态范围。

为了解决这个问题,我们可以使用 FUNARG 设备:在创建函数(即闭包)时将定义环境与主体和形式参数一起存储。然后在扩展的 定义 环境中评估主体,就像现在在 当前 环境 env 中评估的形式参数和实际参数的配对一样。

另见:这个相关的answer by me

您甚至可以同时拥有动态范围和词法范围,从 (lambda ...) 形式创建一个普通的 lambda,将在动态范围下进行评估,并从,例如,创建 lambda 的闭包及其定义环境(function (lambda ...)) 形式(在 Lisp 中),用于词法范围。因此必须在 eval 中处理这两种情况,就像我在上面提到的其他答案中所做的那样。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?