【问题标题】:Evaluation in Scheme方案评价
【发布时间】:2011-01-05 16:24:56
【问题描述】:

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

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

edit 抱歉,我的问题是“它需要一个环境”作为参数是什么意思,该函数到底需要做什么?

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

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

【问题讨论】:

标签: scheme interpreter


【解决方案1】:

环境基本上是一个变量名到值的字典。所以考虑到环境

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

和一个表达式

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

您需要将var1var2var3 的给定值代入表达式,然后计算表达式。

您的函数可能会以某种 Lisp 结构(可能是 alist)作为其参数之一。

【讨论】:

  • 在Scheme中,你使用#f#t而不是nilt,但你有正确的想法。 +1
  • 谢谢@Chris,我最近一直在玩 CL。我会更新答案。
【解决方案2】:

据我所知,您已被要求实施eval

所以你应该首先拥有:

(define (eval expr env)
  ... )

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

前两种情况比较简单,第三种情况,not 过程的应用也应该很容易,因为not 将在环境中(例如(list (cons 'not not)))。

但更难的部分在于最后 2 个。这两个都是宏,需要一些扩展。这些标准定义/扩展应该已经提供给您。展开后,您可以简单地递归调用 eval 来计算展开后的表达式。

祝你好运:)

编辑:

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

【讨论】:

  • 正如你告诉我的,我必须实现“eval”。但是我可以使用“或”和“和”对吗​​?我的意思是这个练习没有提到它们中的任何一个,所以我猜我可以照原样使用它们。
  • @pantelis: andor 有特殊规则,也就是“短路”评估。我想你可以这样做:(and (eval expr1 env) (eval expr2 env))
【解决方案3】:

“环境”在其他语言中可能相当于“范围”。考虑以下 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

【讨论】:

    猜你喜欢
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多