为什么Ammonite脚本失败而REPL运行相同的代码就好了?

时间:2016-10-01 15:36:47

标签: scala ammonite

我用这个安装了菊石: http://www.lihaoyi.com/Ammonite/#Ammonite-Shell

〜/ .ammonite / predef.sc就像安装后一样。

interp.load.ivy("com.lihaoyi" %% "ammonite-shell" % ammonite.Constants.version)
@
val shellSession = ammonite.shell.ShellSession()
import shellSession._
import ammonite.shell.PPrints._
import ammonite.ops._
import ammonite.shell._
ammonite.shell.Configure(repl, wd)

使用Scala 2.11.8 Java 1.8.0_101

,Ammonite Repl为0.7.7

我尝试了非常简单的菊石脚本:

ammtest.sc是

/*
 This is ammonite script file.
*/

import ammonite._
import ammonite.ops._
import ammonite.ops.ImplicitWd._

println("Hello World")

import java.util._
val date = new Date() 
println(date) 

val dir = ls!
println(dir)

当我编译它时,我得到以下错误:

$ amm ammtest.sc
Compiling ammtest.sc
ammtest.sc:17: recursive value dir needs type
println(dir)
        ^
ammtest.sc:17: type mismatch;
 found   : Unit
 required: ammonite.ops.Path
println(dir)
       ^
Compilation Failed

另一方面,当我将相同的代码(开头没有导入)复制/粘贴到菊石REPL时:

println("Hello World")

import java.util._
val date = new Date() 
println(date) 

val dir = ls!
println(dir)

它运行正常,没有任何错误。

1)我是否需要在脚本中输入更多内容以使其像REPL一样运行或者它的问题是什么?    (我知道如果更改,脚本运行正常,例如val dir = ls!pwd)

2)"递归值dir需要什么类型"意思?

3)单身" @"的含义是什么?在predef.sc?

1 个答案:

答案 0 :(得分:1)

val dir = ls!
println(dir)

被视为

val dir = ls.!(println(dir))

这就是后缀运算符令人困惑的原因。

您可以添加一个空行以获得预期的含义。

REPL解析是逐行的。