Scala: fix hash-map nil values and printing.
authorJoel Martin <github@martintribe.org>
Thu, 3 Dec 2015 05:26:50 +0000 (23:26 -0600)
committerJoel Martin <github@martintribe.org>
Thu, 3 Dec 2015 05:26:50 +0000 (23:26 -0600)
scala/step2_eval.scala
scala/step3_env.scala
scala/step4_if_fn_do.scala
scala/step5_tco.scala
scala/step6_file.scala
scala/step7_quote.scala
scala/step8_macros.scala
scala/step9_try.scala
scala/stepA_mal.scala
scala/types.scala

index d31d339..28f4e29 100644 (file)
@@ -13,7 +13,7 @@ object step2_eval {
       case v: MalVector  => v.map(EVAL(_, env))
       case l: MalList    => l.map(EVAL(_, env))
       case m: MalHashMap => {
-        m.map{case (k: String,v: Any) => (k, EVAL(v, env))}
+        m.map{case (k,v) => (k, EVAL(v, env))}
       }
       case _             => ast
     }
index 37572fe..38de2e7 100644 (file)
@@ -14,7 +14,7 @@ object step3_env {
       case v: MalVector  => v.map(EVAL(_, env))
       case l: MalList    => l.map(EVAL(_, env))
       case m: MalHashMap => {
-        m.map{case (k: String,v: Any) => (k, EVAL(v, env))}
+        m.map{case (k,v) => (k, EVAL(v, env))}
       }
       case _             => ast
     }
index b6c2dc1..92d6a2d 100644 (file)
@@ -15,7 +15,7 @@ object step4_if_fn_do {
       case v: MalVector  => v.map(EVAL(_, env))
       case l: MalList    => l.map(EVAL(_, env))
       case m: MalHashMap => {
-        m.map{case (k: String,v: Any) => (k, EVAL(v, env))}
+        m.map{case (k,v) => (k, EVAL(v, env))}
       }
       case _             => ast
     }
index c4511e5..dfd00c1 100644 (file)
@@ -15,7 +15,7 @@ object step5_tco {
       case v: MalVector  => v.map(EVAL(_, env))
       case l: MalList    => l.map(EVAL(_, env))
       case m: MalHashMap => {
-        m.map{case (k: String,v: Any) => (k, EVAL(v, env))}
+        m.map{case (k,v) => (k, EVAL(v, env))}
       }
       case _             => ast
     }
index 0dad7cd..47d68fb 100644 (file)
@@ -15,7 +15,7 @@ object step6_file {
       case v: MalVector  => v.map(EVAL(_, env))
       case l: MalList    => l.map(EVAL(_, env))
       case m: MalHashMap => {
-        m.map{case (k: String,v: Any) => (k, EVAL(v, env))}
+        m.map{case (k,v) => (k, EVAL(v, env))}
       }
       case _             => ast
     }
index 3f0a4d8..a958975 100644 (file)
@@ -42,7 +42,7 @@ object step7_quote {
       case v: MalVector  => v.map(EVAL(_, env))
       case l: MalList    => l.map(EVAL(_, env))
       case m: MalHashMap => {
-        m.map{case (k: String,v: Any) => (k, EVAL(v, env))}
+        m.map{case (k,v) => (k, EVAL(v, env))}
       }
       case _             => ast
     }
index e1a2222..3d12e65 100644 (file)
@@ -72,7 +72,7 @@ object step8_macros {
       case v: MalVector  => v.map(EVAL(_, env))
       case l: MalList    => l.map(EVAL(_, env))
       case m: MalHashMap => {
-        m.map{case (k: String,v: Any) => (k, EVAL(v, env))}
+        m.map{case (k,v) => (k, EVAL(v, env))}
       }
       case _             => ast
     }
index 02c19be..5d32abf 100644 (file)
@@ -72,7 +72,7 @@ object step9_try {
       case v: MalVector  => v.map(EVAL(_, env))
       case l: MalList    => l.map(EVAL(_, env))
       case m: MalHashMap => {
-        m.map{case (k: String,v: Any) => (k, EVAL(v, env))}
+        m.map{case (k,v) => (k, EVAL(v, env))}
       }
       case _             => ast
     }
index 5230cb1..4e6872d 100644 (file)
@@ -72,7 +72,7 @@ object stepA_mal {
       case v: MalVector  => v.map(EVAL(_, env))
       case l: MalList    => l.map(EVAL(_, env))
       case m: MalHashMap => {
-        m.map{case (k: String,v: Any) => (k, EVAL(v, env))}
+        m.map{case (k,v) => (k, EVAL(v, env))}
       }
       case _             => ast
     }
index f9bba40..b0c84f9 100644 (file)
@@ -112,15 +112,13 @@ object types {
 
   // Hash Maps
   class MalHashMap(seq: Any*) {
-    var flat_value: List[Any] = seq.toList
-    var value: Map[String,Any] = flat_value.grouped(2).map(
+    var value: Map[String,Any] = seq.toList.grouped(2).map(
       (kv: List[Any]) => (kv(0).asInstanceOf[String], kv(1))).toMap
     var meta: Any = null
 
     override def clone(): MalHashMap = {
       val new_hm = new MalHashMap()
       new_hm.value = value
-      new_hm.flat_value = flat_value
       new_hm.meta = meta
       new_hm
     }
@@ -138,14 +136,26 @@ object types {
       new MalHashMap(res.flatten.toSeq:_*)
     }
     def ++(that: MalHashMap) = {
-      new MalHashMap((flat_value ++ that.flat_value):_*)
+      val new_hm = clone() 
+      new_hm.value ++= that.value
+      new_hm
     }
 
     override def toString() = {
-      "{" + flat_value.map(_pr_str(_, true)).mkString(" ") + "}"
+      var res = mutable.MutableList[Any]()
+      for ((k,v) <- value) {
+        res += _pr_str(k, true)
+        res += _pr_str(v, true)
+      }
+      "{" + res.mkString(" ") + "}"
     }
     def toString(print_readably: Boolean) = {
-      "{" + flat_value.map(_pr_str(_, print_readably)).mkString(" ") + "}"
+      var res = mutable.MutableList[Any]()
+      for ((k,v) <- value) {
+        res += _pr_str(k, print_readably)
+        res += _pr_str(v, print_readably)
+      }
+      "{" + res.mkString(" ") + "}"
     }
   }
   def _hash_map(seq: Any*) = {