2013-10-20 40 views
0

我有以下代碼:`:load`做什麼,它在Scala REPL中不做什麼?

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下,但2.10下不工作時,我將其加載到REPL。我得到噸的錯誤:

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做什麼,它不做什麼?

回答

3

作爲:help說,

:負載
負荷和解釋斯卡拉文件

它加載文件和解釋行由行,就像它會解釋您提供給REPL的各行,而:粘貼將整個代碼塊解釋爲原子單元。

的錯誤,因爲你可以預測的是,REPL看到

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

可是一竅不通Num和添加類型 - 他們還沒有定義。訣竅使:負荷工作,你想要的方式是包裝所有的代碼在一些超級對象,例如:

object InterpretAsUnit { 
    // all your code goes there 
} 

附: 有趣的事實,是scala -i <your path>幾乎相同scala然後:load <your path>

+0

哦,我的。這不應該在':help'中明確記錄嗎?非常感謝。拯救了我的噩夢。 – day

+0

@plmday我不能說這個答案是否說:在2.11中,:paste文件做你想要的。 :help說:':粘貼[-raw] [path]進入粘貼模式或粘貼文件'。 –

+0

@ som-snytt yep,[其他更改有增強功能:粘貼模式](http://docs.scala-lang.org/scala/2.11/) –