2013-01-15 49 views
2

我想從scala的解釋器中使用IMain方法來運行已轉換爲字符串的函數。但是我無法將用戶創建的類導入到解釋器中。將類文件導入Scala解釋器IMain

例如,你可以很容易地從數據庫中階如導入類:

val m = new IMain() 
m.interpret("import scala.math.sin") 
m.interpret("sin(10)") 

而這種進口仍將只要解釋器​​運行。不過,我一直沒能找到一種方法來導入我所創建的類和對象(或任何私人圖書館):

m.interpret("import sounder.Sounder.play" 
m.interpret("play(t=>50*sin(2*Pi*t*400),0,10") 

(播放是播放聲音了通過計算機的聲卡的方法)

我曾嘗試使用解釋器中的所有方法,但似乎沒有工作。我提出的唯一解決方案是將類文件轉換爲with的一行;分離每一行並通過解釋來運行它,但即使這樣也會遇到妨礙編譯的問題。

是否有一種方法可以輸入到解釋器中,或者是有另一個過程允許scala解釋器處理一個字符串。

感謝您的幫助,我在Windows 7計算機上運行Scala 2.9.2。

+0

完全沒有使用IMain,因爲0__給定的解決方案不起作用。相反,我創建了一個類,它將使用模式匹配來確定正在使用的函數的類型。效率不高,效率不高,但是我能找到的最佳解決方案。 – user1917645

回答

0

你有沒有試過如下:

val m = new IMain() { 
    override protected def parentClassLoader = sounder.Sounder.getClassLoader 
} 

在斯卡拉2.10,你可以這樣做:

val s = new tools.nsc.Settings() 
s.embeddedDefaults[sounder.Sounder] 
val m = new IMain(s) 

您可能會遇到麻煩,如果你通過sbt run發佈您的計劃。該手冊會告訴您,您需要將fork in run := true添加到您的build.sbt,但這對恐懼定製庫沒有幫助。

+0

該方法不適用於Scala 2.9.2。但是當我升級到scala 2.10時,另一種解決方案確實有效。儘管我最終使用了新的字符串插值方法,例如:val func =「play(t => 50 * sin(2 * Pi * t * 400),0,5)」;的 「$ {func}來」 – user1917645