Почему скрипт Ammonite не работает, в то время как REPL отлично выполняет тот же код?

Я установил аммонит, используя это: http://www.lihaoyi.com/Ammonite/#Ammonite-Shell

~ / .ammonite /pref.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 - версия 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

С другой стороны, когда я копирую / вставляю тот же код (без импорта в начале) в 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) Что означает «директория рекурсивного значения требует типа»?

3) Что означает сингл «@» в файле Pref.sc?


person user4955663    schedule 01.10.2016    source источник


Ответы (1)


val dir = ls!
println(dir)

принимается как

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

Вот почему постфиксные операторы сбивают с толку.

Вы можете добавить пустую строку, чтобы получить желаемое значение.

Разбор REPL выполняется построчно.

person som-snytt    schedule 01.10.2016
comment
Точка с запятой в конце строки также работает: val dir = ls !; Вы случайно не знаете, что означает сингл @ в файле Pref.sc? - person user4955663; 02.10.2016
comment
Точка с запятой была бы моим последним выбором после ls.! и (ls !); Я предпочитаю оставлять полупрозрачные для однострочников. См. lihaoyi.com/Ammonite/#Multi-stageScripts. - person som-snytt; 02.10.2016