7 } |
7 } |
8 |
8 |
9 case object Z extends Rec { |
9 case object Z extends Rec { |
10 override def eval(ns: List[Int]) = ns match { |
10 override def eval(ns: List[Int]) = ns match { |
11 case n::Nil => 0 |
11 case n::Nil => 0 |
12 case _ => throw new IllegalArgumentException("Z: args") |
12 case _ => throw new IllegalArgumentException("Z args: " + ns) |
13 } |
13 } |
14 } |
14 } |
15 |
15 |
16 case object S extends Rec { |
16 case object S extends Rec { |
17 override def eval(ns: List[Int]) = ns match { |
17 override def eval(ns: List[Int]) = ns match { |
18 case n::Nil => n + 1 |
18 case n::Nil => n + 1 |
19 case _ => throw new IllegalArgumentException("S: args") |
19 case _ => throw new IllegalArgumentException("S args: " + ns) |
20 } |
20 } |
21 } |
21 } |
22 |
22 |
23 case class Id(n: Int, m: Int) extends Rec { |
23 case class Id(n: Int, m: Int) extends Rec { |
24 override def eval(ns: List[Int]) = |
24 override def eval(ns: List[Int]) = |
25 if (ns.length == n && m < n) ns(m) |
25 if (ns.length == n && m < n) ns(m) |
26 else throw new IllegalArgumentException("Id: args") |
26 else throw new IllegalArgumentException("Id args: " + ns + "," + n + "," + m) |
27 } |
27 } |
28 |
28 |
29 case class Cn(n: Int, f: Rec, gs: List[Rec]) extends Rec { |
29 case class Cn(n: Int, f: Rec, gs: List[Rec]) extends Rec { |
30 override def eval(ns: List[Int]) = |
30 override def eval(ns: List[Int]) = |
31 if (ns.length == n) f.eval(gs.map(_.eval(ns))) |
31 if (ns.length == n) f.eval(gs.map(_.eval(ns))) |