根据下面的问题,布尔表达式的定义是这样的。
编辑抱歉,我的问题是“它需要一个环境”作为参数是什么意思以及该功能究竟需要做什么?
评估例如“T OR F”并返回“F”???
"<expr> ::= <boolean>
|<variable>
|(not <expr>)
|(or <expr> <expr>)
|(and <expr> <expr>"
答案 0 :(得分:2)
环境基本上是值到变量名称的字典。所以给定环境
var1 = #t
var2 = #f
var3 = #t
和表达式
(or var2 (and T (or var1 var3)))
您需要将var1
,var2
和var3
的给定值替换为表达式,然后评估表达式。
您的函数可能会被赋予环境作为某种Lisp结构,可能是alist,作为其参数之一。
答案 1 :(得分:1)
据我所知,你被要求实施eval
。
所以你应该为初学者提供:
(define (eval expr env)
... )
其中 expr 可以是您提及的任何形式, env 会保留定义的符号(可能是关联列表)。
前两个案例相对简单,第三个案例,not
程序的应用也应该很容易,因为not
将在环境中(例如(list (cons 'not not))
)。< / p>
但更难的部分在于最后的2.这两个都是宏,并且需要一些扩展。应该给你标准的定义/扩展。扩展后,您只需递归调用eval
来评估扩展表达式。
修改强>
and
和or
都扩展为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