LARA

Exercises 06

Exercise 1

Consider the following piece of code.

  val x = 1
  val y = 2
  def p() = x + y
  def q(p: Int => Int) = p(x * y)
  def f = {
    val x = 2
    q(p + _)
  }
  def g(q: Int => Int) = {
    val y = 3
    def p() = x - y
    q(f)
  }
  print(g(_ + 2))

Determine the output of the code using static scoping and dynamic scoping.

Exercise 2

If the following programs type-check according to the rules given in the course, give the corresponding type derivation tree, otherwise give a partial tree that shows where it doesn't work

a)

  var x:Int
  var y:Int
  if (1 > 42) x
  else y
  x = y

b)

  var x: Int
  var y: Int
  if (0 > 0) {
    if (3 > 4) {x = y}
    else {y = x}
  }
  else
    if (4 > 3) {x = x}
    else {y = y}

c)

 class C {
  def f(x: Int): Int = 1+f(x)  
}
 

Exercise 3

Write down the type derivation tree for the following example. Does the program type check?

class Fun {
  val u :Boolean
  var a :Boolean 
  def f(y: Boolean): Boolean = {
    a = y
    if (u == y) {
      var u: Int = 0
      a = f(u < 0)
      return u < 0
    } else 
      return u > 0 
  }
}