A simple Scala call-by-name example

Here’s a Scala call-by-name example. I’ll show the normal approach to writing a method and passing in a parameter, and then show a call-by-name (pass by name) example.

1) A “normal” Scala method (call-by-value)

Here I show how to pass a parameter to a method “normally,” i.e., call by value:

object Test extends App {

  def time(): Long = {
      println("In time()")
      System.nanoTime
  }

  def exec(t: Long): Long = {
      println("Entered exec, calling t ...")
      println("t = " + t)
      println("Calling t again ...")
      t
  }

  println(exec(time()))

}

The output looks like this:

In time()
Entered exec, calling t ...
t = 1363909521286596000
Calling t again ...
1363909521286596000

As shown, the values for t are the same. This is because the value of t is determined as soon as this line is invoked:

println(exec(time()))

That is, t is assigned to the value of time() when the compiler creates the exec method and its t parameter.

2) A “call by name” example

Next, make the method parameter a “call by name” parameter with the syntax shown here:

object Test extends App {

  def time() = {
      println("Entered time() ...")
      System.nanoTime
  }

  // `t` is now defined as a by-name parameter
  def exec(t: => Long) = {
      println("Entered exec, calling t ...")
      println("t = " + t)
      println("Calling t again ...")
      t
  }

  println(exec(time()))

}

This time the output is different:

Entered exec, calling t ...
Entered time() ...
t = 1363909593759120000
Calling t again ...
Entered time() ...
1363909593759480000

The two t invocations yield different results. As stated in the Scala Language Specification, this is because:

“This indicates that the argument is not evaluated at the point of function application, but instead is evaluated at each use within the function. That is, the argument is evaluated using call-by-name.”

I don’t like the names by-value and by-name — they don’t have much meaning to me — but I hope this example helps to show the difference between “call by name” and “call by value” function input parameters in Scala.