Scala中的语义规则

Scala中的语义规则,scala,pattern-matching,semantics,Scala,Pattern Matching,Semantics,在这里,我根据两条涉及Scala环境处理的规则编写了代码。 代码中的一切都很完美,但是我对我编写的解释引擎盖后面发生的事情的定义不太自信。我不确定是否有人可以检查我的规则的正确性?我对翻译语义规则没有信心。对于规则二,我理解无效变量将导致计算错误。我不清楚规则1应该定义在什么地方 规则1: 规则2: 关于规则1,您似乎应该向您的评估者添加一个案例 def evalExpr(e: Expr, env: Environment, store: ???): (Value, ???) = e match

在这里,我根据两条涉及Scala环境处理的规则编写了代码。 代码中的一切都很完美,但是我对我编写的解释引擎盖后面发生的事情的定义不太自信。我不确定是否有人可以检查我的规则的正确性?我对翻译语义规则没有信心。对于规则二,我理解无效变量将导致计算错误。我不清楚规则1应该定义在什么地方

规则1: 规则2:


关于规则1,您似乎应该向您的评估者添加一个案例

def evalExpr(e: Expr, env: Environment, store: ???): (Value, ???) = e match {
  //...
  case Seq(e1, e2) =>
    val (v1, store1) = evalExpr(e1, env, store)
    val (v2, store2) = evalExpr(e2, env, store1) // what if v1 = error?
    (v2, store2)

  case LetRec2(f1, x1, e1, f2, x2, e2, env) =>
    evalExpr(e, ExtendMutualRec2(f1, x1, e1, f2, x2, e2, env), store /*???*/)
}

你的问题缺乏背景。可能在相互递归之前,您正在实施普通递归和非递归
@DmytroMitin事先道歉。我不想让内容过多,我想我遗漏了什么是显而易见的。这是正确的。之前您没有提供
Expr
层次结构。
evalExpr
的签名是什么?你可以试着用你的语言编写一个相互递归的测试程序(例如,
isOdd:Num->Bool
isEven:Num->Bool
),看看它的计算是否正确。在第一个屏幕截图上
eval
有两个参数(表达式和环境),在第二个屏幕截图上有三个参数。
case class Seq(e1: Expr, e2: Expr) extends Expr
....
....
case Seq(e1, e2) => {
            val (v1, store1) = evalExpr(e1, env, store)
            val (v2, store2) = evalExpr(e2, env, store1)
            (v2, store2)
            
        }
def evalExpr(e: Expr, env: Environment, store: ???): (Value, ???) = e match {
  //...
  case Seq(e1, e2) =>
    val (v1, store1) = evalExpr(e1, env, store)
    val (v2, store2) = evalExpr(e2, env, store1) // what if v1 = error?
    (v2, store2)

  case LetRec2(f1, x1, e1, f2, x2, e2, env) =>
    evalExpr(e, ExtendMutualRec2(f1, x1, e1, f2, x2, e2, env), store /*???*/)
}