Instructor: Stefan Mitsch
def f (n:Int) = if (n<=1) 1 else n * f (n-1)
def g (n:Int) = f (n) * g (n-1)
def h (n:Int) = h (g (n), f (n))
def i (n:Int) = n * n
int* f(int x) { return &x; }
int* g(int x) { int* y = (int*) malloc (sizeof (int)); *y=x; return y; }
int main(void) {
int* p = f(5);
printf("%d\n", *p);
int* q = g(5);
}
var x:Int = 10
def foo() =
x = 20
def bar() =
var x:Int = 30
foo()
println(x)
def zee() =
var x:Int = 40
bar()
println(x)
bar(); print("bar: " + x)
zee(); print("zee: " + x)
foo(); print("foo: " + x)
Static: bar: 30 20
zee: 30 40 20
foo: 20
Dynamic: bar: 20 10
zee: 20 40 10
foo: 20
enum Expr:
case Literal(x:Int)
case Variable(n:String, v: Option[Expr])
case Neg(e:Expr)
case Plus(l:Expr, r:Expr)
case Minus(l:Expr, r:Expr)
case Times(l:Expr, r:Expr)
case Div(l:Expr, r:Expr)
enum Expr:
case Literal(x:Int)
case Variable(n:String, v:Option[Expr])
case Neg(e:Expr)
case Plus(l:Expr, r:Expr)
case Minus(l:Expr, r:Expr)
case Times(l:Expr, r:Expr)
case Div(l:Expr, r:Expr)
def toInt : Int = this match
case Literal(x) => x
case Variable(n, None) => ???
case Variable(_, Some(e)) => e.toInt
case Neg(e) => -e.toInt
case Plus(l,r) => l.toInt + r.toInt
case Minus(l,r) => l.toInt - r.toInt
case Times(l,r) => l.toInt * r.toInt
case Div(l,r) => l.toInt / r.toInt
def f(a:Int, b:Int) = {
a = b
b = b + 1
}
var x = 5
var y = 10
f(x,y); println(s"x=$x, y=$y")
f(x,x); println(s"x=$x")
f(x,x+2); println(s"x=$x")
def f(): String=>String = {
var s = ""
(t:String) => { s = s + t; s }
}
val a = f()
println(a("x"))
println(a("y"))
println(a("z"))
def f(): ()=>String=>String = {
var s = ""
() => {
var i = 0
(t:String) => { s = s + t + i; i = i+1; s }
}
}
val factory = f()
val a = factory()
val b = factory()
println(a("x"))
println(a("y"))
println(b("z"))
class A {
def f() = { println("A.f") }
}
class B extends A {
override def f() = { println("B.f"); super.f() }
def g() = { println("B.g") }
}
val b:A = new B() // b:B?
b.f()
Does the program compile? If yes, what is printed?
Does b.g() compile? If yes, what is printed?
If no, would it compile with
val b:B = new B()
class A {
def f() = { println("A.f"); this.f() }
}
class B(val a:A) {
def f() = { println("B.f"); a.f() }
}
val b = new B(new A())
b.f()
Does the program compile? If yes, what is printed?
class A {}
class B extends A {}
var as: List[A] = List(new A(), new B())
Which code compiles and why/why not?
val bs: List[B] = as
val bs: List[B] = List(new B(), new B()); as = bs
as(0) = new B()
val a1: Any = as(0) // a1: A // a1: B
class A {}
class B extends A {}
class C extends B {}
val as: List[A] = List(new A(), new C())
val bs: List[B] = List(new B(), new C())
val cs: List[C] = List(new C(), new C())
Which code compiles and why/why not?
var xs: List[_ <: B] = bs
xs = as
xs = cs
val x1: B = xs(0) // x1: Any // x1: C
xs(0) = new C() // new B() // new A()
class A {}
class B extends A {}
class C extends B {}
val as: List[A] = List(new A(), new C())
val bs: List[B] = List(new B(), new C())
val cs: List[C] = List(new C(), new C())
Which code compiles and why/why not?
var xs: List[_ >: B] = bs
xs = cs
xs = as
val x1: A = xs(0) // x1: B // x1: C // x1: Any
xs(0) = new A() // new B() // new C()
function f() {
return {
a: 1,
b: "hello"
c: function () { return 2; }
}
}
f().a?f().d?f().c()?
function f(n) {
var x = n;
return {
get: function(y) { x = x+y; return x; }
}
}
var a = f(3);
var b = a.get(1);
var c = a.get(2);
(let (xs '(1 2 3 4 5 )))
(car s)?(cdr xs)?(cdr (cdr (cdr xs)))?(car (cdr (cdr xs)))?(car (car xs))?
(let (x (cons 1 (cons 2 3))))
val xs = 1 :: 2 :: Nil
val ys = List(1, 2)
val zs = 0 :: xs
val as = List(0) :: xs
val bs = List(0) ::: xs
def f(xs:List[?3]): ?4 = xs.map(x => x+1)
def g(ys:?2): ?1 = ys.foldLeft(0)(_ + _)
g (f (List (1,2,3,4)))