计划评估

时间:2011-01-05 16:24:56

标签: scheme interpreter

好的,我这里有这个问题。我被要求在Scheme中编写一个函数,它接受一个“环境”和一个表达式,并返回该表达式的值,用于在环境中找到的变量绑定。

根据下面的问题,布尔表达式的定义是这样的。

编辑抱歉,我的问题是“它需要一个环境”作为参数是什么意思以及该功能究竟需要做什么?

评估例如“T OR F”并返回“F”???

"<expr> ::= <boolean>
          |<variable>
          |(not <expr>)
          |(or <expr> <expr>)
          |(and <expr> <expr>"

3 个答案:

答案 0 :(得分:2)

环境基本上是值到变量名称的字典。所以给定环境

var1 = #t
var2 = #f
var3 = #t

和表达式

(or var2 (and T (or var1 var3)))

您需要将var1var2var3的给定值替换为表达式,然后评估表达式。

您的函数可能会被赋予环境作为某种Lisp结构,可能是alist,作为其参数之一。

答案 1 :(得分:1)

据我所知,你被要求实施eval

所以你应该为初学者提供:

(define (eval expr env)
  ... )

其中 expr 可以是您提及的任何形式, env 会保留定义的符号(可能是关联列表)。

前两个案例相对简单,第三个案例,not程序的应用也应该很容易,因为not将在环境中(例如(list (cons 'not not)))。< / p>

但更难的部分在于最后的2.这两个都是宏,并且需要一些扩展。应该给你标准的定义/扩展。扩展后,您只需递归调用eval来评估扩展表达式。

祝你好运:)

修改

andor都扩展为if,因此您也需要实现这一点。

答案 2 :(得分:0)

通过“环境”,它们可能意味着相当于其他语言中的“范围”。考虑以下C片段:

if (7 < 100)
{
   int j = 2;
   if (j < 4)
   {
      int k = 7, j = 14;
      printf("k = %d, j = %d\n", k, j);
   }
}

请注意,在外部作用域(由外部大括号标记)中,唯一的变量是j。在内部范围内有一个新的j和一个k。所以这里有三个变量,外部j和内部j和k。

实现此目的的一种方法是将范围定义为“环境”列表。当您输入新块时,您会在列表中添加另一个“环境”。按名称查找变量时,首先查看最近添加的“环境”。如果在那里找不到,则沿着环境列表移动到下一个并查看,依此类推。

“环境”本身通常只是一对配对列表,将变量名称与值进行匹配。所以听起来你被要求将这样的列表传递给你的函数,每一对给出一个布尔变量的符号及其值。根据当前“在范围内”的变量,您可以从环境中获取它们的值,并在您正在评估的表达式中使用它们(根据您已经给出的表达式语法)。

在您的情况下,听起来您并没有被要求担心哪些环境在范围内。你只有一个环境,即一对配对列表。

听起来像是一项工作,祝你好运!

可能有用的一个参考是:

http://michaux.ca/articles/scheme-from-scratch-bootstrap-v0_9-environments