2016-10-01 4 views
0

Ich installierte Ammoniten mit diesem: http://www.lihaoyi.com/Ammonite/#Ammonite-ShellWarum Ammonit-Skript fehlschlägt, während REPL denselben Code ausführt?

~/.ammonite/predef.sc ist, wie es nach der Installation wurde.

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) 

Ammoniten Repl ist v 0.7.7 mit Scala 2.11.8 Java 1.8.0_101

ich sehr einfach Ammoniten Skript versucht:

ammtest.sc ist

/* 
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) 

Wenn Ich kompiliere es Ich erhalte folgenden Fehler:

$ 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 

Auf der anderen Seite, wenn ich Kopieren/den gleichen Code einfügen (ohne Importe am Anfang) an den Ammoniten REPL:

println("Hello World") 

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

val dir = ls! 
println(dir) 

es läuft OK ohne Fehler.

1) Muss ich etwas mehr in das Skript importieren, damit es wie in REPL läuft oder was ist das Problem damit? (Ich weiß, dass das Skript ausgeführt wird, wenn geändert z. B. val dir = ls! Pwd)

2) Was bedeutet "rekursive Wert Dir muss Typ" bedeuten

3) Was bedeutet die einzelne "@" in der predef.sc?

Antwort

1
val dir = ls! 
println(dir) 

genommen als

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

, deshalb, Postfix-Operatoren verwirrend sind.

Sie können eine Leerzeile hinzufügen, um die gewünschte Bedeutung zu erhalten.

Das REPL-Parsing erfolgt Zeile für Zeile.

+0

Semikolon am Ende der Zeile funktioniert auch: val dir = ls !; Weißt du zufällig, was die einzelne "@" in der predef.sc bedeutet? – user4955663

+0

Semikolon wäre meine letzte Wahl nach 'ls.!' Und '(ls!)'; Ich neige dazu, Semi für Single-Liner zu reservieren. Siehe http://www.lihaoyi.com/Ammonite/#MultistageScripts –

Verwandte Themen