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 } }