allow reading and writing to arbitrary streams, not just Console

git-svn-id: http://lampsvn.epfl.ch/svn-repos/scala/scala/trunk@6732 5e8d7ff9-d8ef-0310-90f0-a4852d11357a
This commit is contained in:
spoon 2006-03-13 15:25:28 +00:00
parent 7461ef79b7
commit f7849642b7
1 changed files with 31 additions and 19 deletions

View File

@ -5,35 +5,38 @@
// $Id$
package scala.tools.nsc
import java.io.{BufferedReader, FileReader, IOException, InputStreamReader}
import java.io.{BufferedReader, FileReader, IOException, InputStreamReader, PrintWriter}
import scala.tools.nsc.util.{Position}
import scala.tools.nsc.reporters.{Reporter, ConsoleReporter}
/** The main class for the new scala interpreter.
*/
object MainInterpreter {
val reporter = new ConsoleReporter()
/** The main loop of the Scala interpreter. After instantiation, clients
* should call the main() method
*/
class InterpreterLoop(in: BufferedReader, out: PrintWriter) {
def this() = this(new BufferedReader(new InputStreamReader(System.in)),
new PrintWriter(System.out))
val reporter = new ConsoleReporter(in, out)
var interpreter: Interpreter = _
/** print a friendly help message */
def printHelp = {
Console.println("This is an interpreter for Scala.")
Console.println("Type in expressions to have them evaluated.")
Console.println("Type :quit to exit the interpreter.")
Console.println("Type :compile followed by a filename to compile a complete Scala file.")
Console.println("Type :load followed by a filename to load a sequence of interpreter commands.")
Console.println("Type :help to repeat this message later.")
out.println("This is an interpreter for Scala.")
out.println("Type in expressions to have them evaluated.")
out.println("Type :quit to exit the interpreter.")
out.println("Type :compile followed by a filename to compile a complete Scala file.")
out.println("Type :load followed by a filename to load a sequence of interpreter commands.")
out.println("Type :help to repeat this message later.")
}
/** The main read-eval-print loop for the interpereter. It calls
command() for each line of input, and stops when command()
returns false */
def repl: Unit = {
val in = new BufferedReader(new InputStreamReader(System.in))
def repl(): Unit = {
while(true) {
Console.print("\nscala> ")
out.print("\nscala> ")
out.flush
var line = in.readLine()
if(line == null)
return () // assumes null means EOF
@ -61,7 +64,7 @@ object MainInterpreter {
new FileReader(filename)
} catch {
case _:IOException =>
Console.println("Error opening file: " + filename)
out.println("Error opening file: " + filename)
null
}
if (fileIn == null) return ()
@ -82,7 +85,7 @@ object MainInterpreter {
def withFile(command: String)(action: String => Unit): Unit = {
val spaceIdx = command.indexOf(' ')
if (spaceIdx <= 0) {
Console.println("That command requires a filename to be specified.")
out.println("That command requires a filename to be specified.")
return ()
}
val filename = command.substring(spaceIdx).trim
@ -95,7 +98,7 @@ object MainInterpreter {
case ":quit" => return false
case _ if line.startsWith(":compile") => withFile(line)(f => interpreter.compile(f))
case _ if line.startsWith(":load") => withFile(line)(f => interpretAllFrom(f))
case _ => Console.println("Unknown command. Type :help for help.")
case _ => out.println("Unknown command. Type :help for help.")
}
else if(line.startsWith("#!/")) // skip the first line of Unix scripts
()
@ -125,7 +128,7 @@ object MainInterpreter {
interpreter.beQuiet
command.files match {
case List(filename) => interpretAllFrom(filename)
case _ => Console.println(
case _ => out.println(
"Sorry, arguments to interpreter scripts are not currently supported.")
}
} else {
@ -138,3 +141,12 @@ object MainInterpreter {
}
}
/** A wrapper that provides a command-line interface */
object MainInterpreter {
def main(args: Array[String]): Unit = {
(new InterpreterLoop(new BufferedReader(new InputStreamReader(System.in)),
new PrintWriter(new java.io.FileWriter("out")))).main(args)
}
}