【问题标题】:Why Ammonite script fails while REPL runs same code just fine?为什么在 REPL 运行相同的代码时 Ammonite 脚本会失败?
【发布时间】:2017-02-10 00:44:07
【问题描述】:

我使用这个安装了菊石: 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)

Ammonite Repl 是 v 0.7.7 和 Scala 2.11.8 Java 1.8.0_101

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

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

另一方面,当我将相同的代码(开头没有导入)复制/粘贴到 ammonite 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 中的单个“@”是什么意思?

【问题讨论】:

    标签: scala ammonite


    【解决方案1】:
    val dir = ls!
    println(dir)
    

    被视为

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

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

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

    REPL 解析是逐行的。

    【讨论】:

    • 行尾的分号也可以:val dir = ls!;你知道predef.sc中的单个“@”是什么意思吗?
    • 分号将是我在ls.!(ls !) 之后的最后选择;我倾向于为单线保留半。见lihaoyi.com/Ammonite/#Multi-stageScripts
    猜你喜欢
    • 2020-07-15
    • 2013-02-17
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多