On compiling the following code with Scala 2.7.3,
package spoj
object Prime1 {
def main(args: Array[String]) {
def isPrime(n: Int) = (n != 1) && (2 to n/2 forall (n % _ != 0))
val read = new java.util.Scanner(System.in)
var nTests = read nextInt // [*]
while(nTests > 0) {
val (start, end) = (read nextInt, read nextInt)
start to end filter(isPrime(_)) foreach println
println
nTests -= 1
}
}
}
I get the following compile time error :
PRIME1.scala:8: error: illegal start of simple expression
while(nTests > 0) {
^
PRIME1.scala:14: error: block must end in result expression, not in definition
}
^
two errors found
When I add a semicolon at the end of the line commented as [*], the program compiles fine. Can anyone please explain why does Scala’s semicolon inference fail to work on that particular line?
Is it because scala is assuming that you are using the syntax
a foo b(equivalent toa.foo(b)) in your call toreadInt. That is, it assumes that thewhileloop is the argument toreadInt(recall that every expression has a type) and hence the last statement is a declaration:where
xis your while block.I must say that, as a point of preference, I’ve now returned to using the usual
a.foo(b)syntax overa foo bunless specifically working with a DSL which was designed with that use in mind (like actors’a ! b). It makes things much clearer in general and you don’t get bitten by weird stuff like this!