Hi all,

I find the proposed function let-> in Clojure 1.5 very useful, but a bit
ugly.  The arguments are backwards when compared to vanilla let, and it
doesn't support destructuring where it easily could (which I believe would
be helpful when threading 'state-like' maps, as I find let-> very useful
for).

I'd like to float an alternative implementation which improves on both
these issues.  Thoughts?

(defmacro new-let->
  "Establishes bindings as provided for let, evaluates the first form
   in the lexical context of that binding, then re-establishes bindings
   to that result, repeating for each successive form"
  [bindings & forms]
  (assert (vector? bindings) "binding must be a vector")
  (assert (= 2 (count bindings)) "binding vector must contain exactly two
forms")
  `(let [~@bindings
         ~@(interleave (repeat (bindings 0)) (drop-last forms))]
     ~(last forms)))

(new-let-> [{:keys [foo bar] :as state} {:foo 1 :bar 2}]
  (assoc state :foo (inc bar))
  (assoc state :bar (inc foo))) ; => {:foo 3, :bar 4}

-- 
*Alex Nixon*

Software Engineer | SwiftKey

*a...@swiftkey.net** | http://www.swiftkey.net/*

++++++
WINNER - MOST INNOVATIVE MOBILE
APP<http://www.swiftkey.net/swiftkey-wins-most-innovative-app-at-mwc>
 - GSMA GLOBAL MOBILE AWARDS 2012

Head office: 91-95 Southwark Bridge Road, London, SE1 0AX TouchType is a
limited company registered in England and Wales, number 06671487.
Registered office: 91-95 Southwark Bridge Road, London, SE1 0AX

-- 
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