How to enter multiline commands (statements) into the Scala REPL

When you want to test a multiline command/statement in the Scala REPL, you can easily run into a problem where the REPL gets confused, or more accurately, it attempts to evaluate your statement too early.

As a simple example of this, imagine that you want to test the Scala if statement syntax. You begin typing your if statement normally, but when you hit [Enter] after your second line, you’ll see that everything blows up:

scala> if (true) 
     |   print "t"
<console>:2: error: ';' expected but string literal found.
         print "t"
               ^

This error happens because the Scala REPL environment isn’t exactly the same as working in something like an IDE. The REPL generally just sees one line of code at a time, attempts to interpret it, and print the result of that line. If your statement doesn’t end on one line, boom!

Resolving the problem with the :paste command

A simple way to get around this multiline statement problem is to use the :paste command in the REPL. Before entering your multiline statement, type the :paste command into the REPL:

scala> :paste
// Entering paste mode (ctrl-D to finish)

When you do this, the REPL prompts you to paste in your command — your multiline expression — and then press [Ctrl][D] at the end of your command. In this example I paste in my complete multiline if statement, and then press [Ctrl][D]:

scala> :paste
// Entering paste mode (ctrl-D to finish)

if (true)
  print("that was true")
else
  print("false")

// Exiting paste mode, now interpreting.

that was true

After entering my four-line if statement, I pressed [Ctrl][D], and after that the line “// Exiting paste mode, now interpreting” was printed, followed by the output from my if statement (“that was true”).

Entering multiline commands in the REPL without :paste

In some cases you can create multiline commands in the Scala REPL without using the :paste command. For the example shown, you just need to add curly braces to the if statement to let the REPL know that a block is coming up:

scala> if (true) {
     |   print("true")
     | } else {
     |   print("false")
     | }
true

However, you can’t always do this, and I usually prefer to type :paste and then enter my statements just like I would in an IDE.

In summary, I hope this example of how to use the :paste command to let you enter multiline commands in the Scala REPL has been helpful.

Scala REPL video

If you’re interested in more information on the Scala REPL and like videos, here’s an intro video I made: