summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBurak Emir <emir@epfl.ch>2007-01-24 15:36:35 +0000
committerBurak Emir <emir@epfl.ch>2007-01-24 15:36:35 +0000
commit57dd329199add85e8aeec6c655d5d7a509f0fa25 (patch)
treeff7c0e54c304f72c2d0731bc426938a98a9a3933
parentb7b7d30add31f6aaf0f64134a9cca12cec89bd27 (diff)
downloadscala-57dd329199add85e8aeec6c655d5d7a509f0fa25.tar.gz
scala-57dd329199add85e8aeec6c655d5d7a509f0fa25.tar.bz2
scala-57dd329199add85e8aeec6c655d5d7a509f0fa25.zip
test case for unapply gadt evaluator
-rw-r--r--test/pending/pos/unappgadteval.scala35
1 files changed, 35 insertions, 0 deletions
diff --git a/test/pending/pos/unappgadteval.scala b/test/pending/pos/unappgadteval.scala
new file mode 100644
index 0000000000..0c22c71dee
--- /dev/null
+++ b/test/pending/pos/unappgadteval.scala
@@ -0,0 +1,35 @@
+//Class hierarchy
+trait Term[a]
+object Var{ def unapply[a](x:Var[a]) = Some(x.name) }
+class Var[a] (val name : String) extends Term[a]
+object Num{ def unapply(x:Num) = Some(x.value) }
+class Num (val value : int) extends Term[int]
+object Lam{ def unapply[b,c](l:Lam[b,c]) = Some{l.x,l.e}}
+class Lam[b, c] (val x : Var[b], val e : Term[c]) extends Term[b => c]
+object App{ def unapply[b,c](a:App[b,c]) = Some{a.f,a.e}}
+class App[b, c] (val f : Term[b => c], val e : Term[b]) extends Term[c]
+object Suc{ def unapply(a:Suc) = true }
+class Suc () extends Term[int => int]
+// Environments :
+abstract class Env {
+ def apply[a](v : Var[a]): a
+ def extend[a](v : Var[a], x : a) = new Env {
+ def apply[b](w: Var[b]): b = w match {
+ case _ : v.type => x // v eq w, hence a = b
+ case _ => Env.this.apply(w)
+ }}
+}
+
+object empty extends Env {
+ def apply[a](x : Var[a]): a = throw new Error("not found : "+x.name)
+}
+object Test {
+// Evaluation :
+def eval[a](t : Term[a], env : Env): a = t match {
+ case v : Var[b] => env(v) // a = b
+ case n @ Num(value) => value // a = int
+ case i @ Suc() => { y: int => y + 1 } // a = int=>int
+ case f @ Lam[b,c](x,e) => { y: b => eval(e, env.extend(x, y))} // a = b=>c
+ case a @ App(f,e) => eval(f, env)(eval(e, env)) // a = c
+}
+}