什么`:load`做什么,Scala REPL做什么不做?

时间:2013-10-20 21:41:50

标签: scala read-eval-print-loop

我有以下代码:

abstract class AExp {
  def eval : Int = this match {
    case Num(n) => n
    case Add(e1, e2) => e1.eval + e2.eval
  }
}

case class Num(n : Int) extends AExp
case class Add(e1 : AExp, e2 : AExp) extends AExp

case class Prd(e1 : AExp, e2 : AExp) extends AExp {
  override def eval : Int = e1.eval * e2.eval
}

它在Scala 2.8 here下工作正常但在我将其加载到REPL时在2.10下不起作用。我收到了很多错误:

scala> :l aexp.scala
Loading aexp.scala...
<console>:9: error: not found: value Num
           case Num(n) => n
                ^
<console>:9: error: not found: value n
           case Num(n) => n
                          ^
<console>:10: error: not found: value Add
           case Add(e1, e2) => e1.eval + e2.eval
                ^
<console>:10: error: not found: value e1
           case Add(e1, e2) => e1.eval + e2.eval
                               ^
<console>:7: error: not found: type AExp
       case class Num(n : Int) extends AExp
                                       ^
<console>:7: error: not found: type AExp
       case class Add(e1 : AExp, e2 : AExp) extends AExp
                                                    ^
<console>:7: error: not found: type AExp
       case class Add(e1 : AExp, e2 : AExp) extends AExp
                           ^
<console>:7: error: not found: type AExp
       case class Add(e1 : AExp, e2 : AExp) extends AExp
                                      ^
<console>:7: error: not found: type AExp
       case class Prd(e1 : AExp, e2 : AExp) extends AExp {
                                                    ^
<console>:7: error: not found: type AExp
       case class Prd(e1 : AExp, e2 : AExp) extends AExp {
                           ^
<console>:7: error: not found: type AExp
       case class Prd(e1 : AExp, e2 : AExp) extends AExp {
                                      ^

但是相同的代码在2.10 REPL下的:paste模式下工作正常。这里发生了什么? :load做了什么,做了什么?

1 个答案:

答案 0 :(得分:3)

正如:help所说,

  

:加载
  加载并解释Scala文件

它加载文件,解释 逐行,就像它会解释你提供给REPL的各行一样,而:粘贴解释整个代码块作为一个原子单位。

您可以预测的错误是repl看到了

abstract class AExp {
  def eval : Int = this match {
    case Num(n) => n
    case Add(e1, e2) => e1.eval + e2.eval
  }
}

但对Num和Add类型一无所知 - 它们尚未定义。要做的诀窍:以你想要的方式加载工作是将你的所有代码包装在一些超级对象中,例如:

object InterpretAsUnit {
  // all your code goes there
}

P.S。 有趣的是,scala -i <your path>几乎与scala相同,然后是:load <your path>