 
 (deftype List [meta first rest count]
   IWithMeta
-  (-with-meta [coll meta] (new List meta first rest count))
+  (-with-meta [coll meta] (List. meta first rest count))
 
   IMeta
   (-meta [coll] meta)
 
   ISeq
   (-first [coll] first)
-  (-rest [coll] (if (nil? rest) (new EmptyList meta) rest))
+  (-rest [coll] (if (nil? rest) (EmptyList. meta) rest))
 
   IStack
   (-peek [coll] first)
   (-pop [coll] (irest coll))
 
   ICollection
-  (-conj [coll o] (new List meta o coll (inc count)))
+  (-conj [coll o] (List. meta o coll (inc count)))
 
 ; IEmptyableCollection
 ; (iempty [coll] coll)


(deftype Cons [meta first rest]
  IWithMeta
  (-with-meta [coll meta] (new Cons meta first rest))

  IMeta
  (-meta [coll] meta)

  ICounted
  (-count [coll] 0))

(set! cljs.core.List.EMPTY (EmptyList. nil))

(defn list [& items]
  ; when we have reduce: (reduce conj () (reverse items))
