Thanks, Evan; I had a use-case where the truthiness of nil would have
forced me out of `let-else.' This new predicate-abstraction is
beautiful.

Quoth Evan Gamble on Sweetmorn, the 49th of The Aftermath:
> Thanks for your comment, Sam.
> 
> Before you posted the comment, Peter Danenberg had asked if I would
> modify let-else to include the behavior of your let? macro. Your
> comment and his request have spurred me to action.
> 
> I've modified the macro to accept optional :when <pred> and :else
> <expr> clauses after bindings. The :when clause acts just like
> your :ensure clause.
> It works with just :when or just :else or both, in either order.
> 
> I've also renamed my macro to be let?, because with the addition
> of :when, the name let-else doesn't make sense.
> 
> The jar is still at https://clojars.org/org.clojars.egamble/let-else
> The code is still at https://github.com/egamble/let-else
> 
> - Evan
> 
> On Dec 6, 7:13 pm, Sam Ritchie <sritchi...@gmail.com> wrote:
> > I had a pattern that kept popping up in code of:
> >
> > (let [x (foo)
> >       y  (bar)]
> >     (when y
> >        (let [ ....]
> >            ....)))
> >
> > that check jarred me, so I put this 
> > together:https://gist.github.com/1347312. On reflection, discomfort with 
> > indentation
> > levels probably isn't near the top of the "to macro or not to macro?"
> > checklist.
> >
> > (defmacro let?
> > [bindings & body]
> >  (let [[bind [kwd pred & more]] (split-with (complement #{:ensure})
> > bindings)]
> > `(let [~@bind]
> >  ~@(cond (and kwd more) [`(when ~pred (check-let [~@more] ~@body))]
> > kwd [`(when ~pred ~@body)]
> >  :else body))))
> >
> > (let? [x 100
> > y 300
> >  :ensure (pos? y)
> > z (- y 250)]
> >  z)
> >
> > ;; expands to
> >
> > (let [x 100
> > y 300]
> >  (when (pos? y)
> > (let [z (- y 250)]
> >  z))) ;; => 50
> >
> > ;; and returns 50. The following returns nil:
> >
> > (let? [x 100
> >
> >        y 300
> >
> >        :ensure (neg? y)
> >
> >        z (- y 250)]
> >       z) ;; => nil
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > On Tue, Dec 6, 2011 at 11:51 AM, Evan Gamble <solar.f...@gmail.com> wrote:
> > > I noticed in my code that I often nest a let inside an if-let, or vice-
> > > versa, so I wrote a macro let-else that expands into nested lets,
> > > except where there's an :else <expr> after a binding, in which case
> > > that binding expands into an if-let.
> >
> > > E.g.
> >
> > > (let-else
> > >  [foo (f1) :else (e)
> > >   bar (f2)]
> > >  (b1)
> > >  (b2))
> >
> > > expands into
> >
> > > (if-let [foo (f1)]
> > >  (let [bar (f2)]
> > >    (b1)
> > >    (b2))
> > >  (e))
> >
> > > The jar is athttps://clojars.org/org.clojars.egamble/let-else
> > > The code is athttps://github.com/egamble/let-else
> >
> > > - Evan
> >
> > > --
> > > 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
> >
> > --
> > Sam Ritchie, Twitter Inc
> > 703.662.1337
> > @sritchie09
> >
> > (Too brief? Here's why!http://emailcharter.org)
> 
> -- 
> 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
> 

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