Guest User

Untitled

a guest
Nov 24th, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.52 KB | None | 0 0
  1. /**
  2. * Marin Barisa
  3. * date: June 1, 2011
  4. */
  5.  
  6. object callccInterpreter {
  7.  
  8. type Answer = Value;
  9.  
  10. case class M[A](in: (A => Answer) => Answer) {
  11. def bind[B](k: A => M[B]) = M[B](c => in (a => k(a) in c))
  12. def map[B](f: A => B): M[B] = bind(x => unitM(f(x)))
  13. def flatMap[B](f: A => M[B]): M[B] = bind(f)
  14. }
  15.  
  16. def unitM[A](a: A) = M[A](c => c(a))
  17.  
  18. def id[A] = (x: A) => x
  19. def showM(m: M[Value]): String = (m in id).toString()
  20.  
  21. def callCC[A](h: (A => M[A]) => M[A]) =
  22. M[A](c => h(a => M[A](d => c(a))) in c)
  23.  
  24. type Name = String
  25.  
  26. trait Term
  27. case class Var(x: Name) extends Term
  28. case class Con(n: int) extends Term
  29. case class Add(l: Term, r: Term) extends Term
  30. case class Lam(x: Name, body: Term) extends Term
  31. case class App(fun: Term, arg: Term) extends Term
  32. case class Ccc(x: Name, t: Term) extends Term
  33.  
  34. trait Value
  35. case object Wrong extends Value {
  36. override def toString() = "wrong"
  37. }
  38. case class Num(n: Int) extends Value {
  39. override def toString() = n.toString()
  40. }
  41. case class Fun(f: Value => M[Value]) extends Value {
  42. override def toString() = "<function>"
  43. }
  44.  
  45. type Environment = List[Pair[Name, Value]];
  46.  
  47. def lookup(x: Name, e: Environment): M[Value] = e match {
  48. case List() => unitM(Wrong)
  49. case Pair(y, b) :: e1 => if (x == y) unitM(b) else lookup(x, e1)
  50. }
  51.  
  52. def add(a: Value, b: Value): M[Value] = Pair(a, b) match {
  53. case Pair(Num(m), Num(n)) => unitM(Num(m + n))
  54. case _ => unitM(Wrong)
  55. }
  56.  
  57. def apply(a: Value, b: Value): M[Value] = a match {
  58. case Fun(k) => k(b)
  59. case _ => unitM(Wrong)
  60. }
  61.  
  62. def interp(t: Term, e: Environment): M[Value] = t match {
  63. case Var(x) => lookup(x, e)
  64. case Con(n) => unitM(Num(n))
  65. case Add(l, r) => for (val a <- interp(l, e);
  66. val b <- interp(r, e);
  67. val c <- add(a, b))
  68. yield c
  69. case Lam(x, t) => unitM(Fun(a => interp(t, Pair(x, a) :: e)))
  70. case App(f, t) => for (val a <- interp(f, e);
  71. val b <- interp(t, e);
  72. val c <- apply(a, b))
  73. yield c
  74. case Ccc(x, t) => callCC(k => interp(t, Pair(x, Fun(k)) :: e))
  75. }
  76.  
  77. def test(t: Term): String = showM(interp(t, List()))
  78.  
  79. val term0 = App(Lam("x", Add(Var("x"), Var("x"))), Add(Con(10), Con(11)))
  80. val term1 = App(Con(1), Con(2))
  81. val term2 = Add(Con(1), Ccc("k", Add(Con(2), App(Var("k"), Con(4)))))
  82.  
  83. def main(args: Array[String]) {
  84. println(test(term0))
  85. println(test(term1))
  86. println(test(term2))
  87. }
  88. }
Add Comment
Please, Sign In to add comment