Seperate so it can be easily ignored:

Changed in core.clj:

(defn nth
  "Returns the value at the index. get returns nil if index out of
  bounds, nth throws an exception unless not-found is supplied.  nth
  also works for strings, Java arrays, regex Matchers and Lists, and,
  in O(n) time, for sequences."
  {:inline (fn ([c i] `(. clojure.lang.RT (nth ~c ~i)))
               ([c i n] `(. clojure.lang.RT (nth ~c ~i ~n))))
   :inline-arities #{2 3}}
  ([coll index] (. clojure.lang.RT (nth coll index)))
  ([coll index not-found] (. clojure.lang.RT (nth coll index not-
found))))
;;changed to inline the 3ary version of nth


(defn destructure [bindings]
  (let [bmap (apply array-map bindings)
        pb (fn pb [bvec b v]
               (let [pvec
                     (fn [bvec b val]
                       (let [gvec (if (symbol? val) val (gensym
"vec__")),
                             length-val (:length ^val)]

                         (loop [ret (if (symbol? val) bvec (-> bvec
(conj gvec) (conj val)))
                                n 0
                                bs b
                                seen-rest? false]
                           (if (seq bs)
                             (let [firstb (first bs)]
                               (cond
                                (= firstb '&) (recur (pb ret (second
bs) (list `nthnext gvec n))
                                                     n
                                                     (nnext bs)
                                                     true)
                                (= firstb :as) (pb ret (second bs)
gvec)
                                :else (if seen-rest?
                                        (throw (new Exception
"Unsupported binding form, only :as can follow & parameter"))
                                        (recur (pb ret firstb (if (and
length-val (< n length-val))
                                                                (if (or 
(vector? val)(= (:tag ^val) :vector))
                                                                        (list 
gvec n)
                                                                        (list 
`nth gvec n))
                                                                (list `nth gvec 
n nil)))
                                               (inc n)
                                               (next bs)
                                               seen-rest?))))
                             ret))))
                     pmap
                     (fn [bvec b v]
                       (let [gmap (or (:as b) (if (symbol? v) v
(gensym "map__")))
                             defaults (:or b)]
                         (loop [ret (if (symbol? v) bvec (-> bvec
(conj gmap) (conj v)))
                                bes (reduce
                                     (fn [bes entry]
                                       (reduce #(assoc %1 %2 ((val
entry) %2))
                                               (dissoc bes (key
entry))
                                               ((key entry) bes)))
                                     (dissoc b :as :or)
                                     {:keys #(keyword (str %)), :strs
str, :syms #(list `quote %)})]
                           (if (seq bes)
                             (let [bb (key (first bes))
                                   bk (val (first bes))
                                   has-default (contains? defaults
bb)]
                               (recur (pb ret bb (if has-default
                                                   (list `get gmap bk
(defaults bb))
                                                   (list `get gmap
bk)))
                                      (next bes)))
                             ret))))]
                 (cond
                  (symbol? b) (-> bvec (conj b) (conj v))
                  (vector? b) (pvec bvec b v)
                  (map? b) (pmap bvec b v)
                  :else (throw (new Exception (str "Unsupported
binding form: " b))))))
        process-entry (fn [bvec b] (pb bvec (key b) (val b)))]
    (if (every? symbol? (keys bmap))
      bindings
      (reduce process-entry [] bmap))))

;;I wasn't sure how to do a 'vector' (kept getting the 'vector'
function instead) so I just used
;;:vector keyword to dispatch  on. Becomes kind of unsafe if you
violate the 'length' promise.
;;this also eliminates a redundancy where you were binding (let [v [1
2 3]] (let [[a b c] v]))
;;and the inner let would have (let [gensym_vec v, a (nth gensym_vec
0)...])
;;as opposed to (let [a (nth v 0)...]...)
;;which should be ok because we don't have to worry about multiple
evaluation if we are destructuring from a symbol.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to