Scripting with Scala: How to launch an uncompiled script?

天涯浪子 提交于 2019-12-20 12:42:49

问题


Apart from serious performance problems, Scala is a very powerful language. Therefore I am now using it frequently for scripted tasks inside Bash. Is there a way to just execute a *.scala file exactly the way I can do with Python files? As far as I know, Python uses bytecode to execute programs, exactly like the JVM does. However, there is not anything called pythonc (like scalac or javac) I need to call in order to accomplish this. Hence I expect Scala to be able to act in a similar manner.


回答1:


I don't use python, but in Scala, the most scripty thing I can do is this:

thinkpux:~/proj/mini/forum > echo 'println(" 3 + 4 = " + (3 + 4))' | scala 
Welcome to Scala version 2.10.2 (Java HotSpot(TM) Server VM, Java 1.7.0_09).
Type in expressions to have them evaluated.
Type :help for more information.

scala> println(" 3 + 4 = " + (3 + 4))
 3 + 4 = 7

scala> thinkpux:~/proj/mini/forum > 

However, afterwards, I don't have visual feedback in the bash, so I have to call 'clear'.

But there is no problem in writing a script and executing that:

thinkpux:~/proj/mini/forum > echo 'println(" 3 + 4 = " + (3 + 4))' > print7.scala 
thinkpux:~/proj/mini/forum > scala print7.scala 
 3 + 4 = 7

Then, there aren't issues with the shell.

With an enclosing class, the code wouldn't be executed:

thinkpux:~/proj/mini/forum > echo -e 'class Foo {\nprintln(" 3 + 4 = " + (3 + 4))\n}\n'
class Foo {
println(" 3 + 4 = " + (3 + 4))
}

thinkpux:~/proj/mini/forum > scala Foo.scala 
thinkpux:~/proj/mini/forum > cat Foo.scala 
class Foo {
println(" 3 + 4 = " + (3 + 4))
}

But with instatiating a class, you can execute code in it, without using the wellknown (hope so) 'main' way:

thinkpux:~/proj/mini/forum > echo -e 'class Foo {\nprintln(" 3 + 4 = " + (3 + 4))\n}\nval foo = new Foo()'  > Foo.scala
thinkpux:~/proj/mini/forum > cat Foo.scala 
class Foo {
println(" 3 + 4 = " + (3 + 4))
}
val foo = new Foo()
thinkpux:~/proj/mini/forum > scala Foo.scala 
 3 + 4 = 7



回答2:


The scala man page provides some examples on how to run Scala code fragments as if they were a script, for both Windows and non-Windows platforms (below examples copied from the man page):

Unix

   #!/bin/sh
   exec scala "$0" "$@"
   !#
   Console.println("Hello, world!")
   argv.toList foreach Console.println

Windows

   ::#!
   @echo off
   call scala %0 %*
   goto :eof
   ::!#
   Console.println("Hello, world!")
   argv.toList foreach Console.println

To speed up subsequent runs you can cache the compiled fragment with the -savecompiled option:

   #!/bin/sh
   exec scala -savecompiled "$0" "$@"
   !#
   Console.println("Hello, world!")
   argv.toList foreach Console.println

Update: as of Scala 2.11 (as noted in this similar answer), you can now just do this on Unix:

#!/usr/bin/env scala
println("Hello, world!")
println(args.mkString(" "))


来源:https://stackoverflow.com/questions/17756775/scripting-with-scala-how-to-launch-an-uncompiled-script

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!