A simple Scala call-by-name example

Here’s a simple 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 expected, 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()))

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
  }

  // uses a by-name parameter here
  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.”

That’s a simple “call by name” example in Scala. I hope it helps to show the difference between “call by name” and “call by value” function input parameters.

Add new comment

The content of this field is kept private and will not be shown publicly.

Anonymous format

  • Allowed HTML tags: <em> <strong> <cite> <code> <ul type> <ol start type> <li> <pre>
  • Lines and paragraphs break automatically.
By submitting this form, you accept the Mollom privacy policy.