 (defmacro lazy-cat
   "Expands to code which yields a lazy sequence of the concatenation
   of the supplied colls.  Each coll expr is not evaluated until it is
-  needed.
+  needed. 
 
   (lazy-cat xs ys zs) === (concat (lazy-seq xs) (lazy-seq ys) (lazy-seq zs))"
   [& colls]
   `(concat ~@(map #(core/list `lazy-seq %) colls)))
+
+(defmacro js-str [s]
+  (core/list 'js* "''+~{}" s))
+
+(defmacro es6-iterable [ty]
+  `(aset (.-prototype ~ty) cljs.core/ITER_SYMBOL
+     (fn []
+       (this-as this#
+         (cljs.core/es6-iterator this#)))))

  before the vars are bound to their new values."
  [bindings & body]
  (let [names (take-nth 2 bindings)]
    #_(cljs.analyzer/confirm-bindings &env names)
    `(with-redefs ~bindings ~@body)))

(defmacro condp

                     (filter (complement sym-or-str?) (keys kvs))
                     (repeatedly gensym))
        obj (gensym "obj")]
    `(let [~@(apply concat (clojure.set/map-invert expr->local))
           ~obj ~(js-obj* (filter-on-keys core/string? kvs))]
       ~@(map (fn [[k v]] `(aset ~obj ~k ~v)) sym-pairs)
       ~@(map (fn [[k v]] `(aset ~obj ~v ~(core/get kvs k))) expr->local)
