On 9 April 2012 00:05, Benjamin Saunders <ralith@gmail.com> wrote:
and it adds quite some complexity when reading the code.
This is indeed subjective. I find it to be clearer to read than the alternatives, but perhaps that's just me? Anaphora would seem to be
WHEN-LET and IF-LET have a fairly common use-case: (when-let ((x (gethash key table))) (bar x)) compared to (let ((x (gethash key table))) (when x (bar x))) where in a typical case the /relative/ reduction in lines of code is a substantial 33% -- and they are also "classic": been around forever, re-invented independently by several people. For the single-binding case there is also little chance of "guessing wrong" what it actually does. In case of PROG1-LET, I actually assumed (prog1-let ((x (foo))) (bar x) (quux x)) would have been equivalent to (let ((x (foo))) (prog1 (bar x) (quux x))) and the possibility it might mean (let ((x (foo))) (prog1 x (bar) (quux))) didn't even register -- in particular because I would write that as just a LET, without using PROG1 at all: (let ((x (foo))) (bar x) (quux x) x) -- or better yet, when possible make QUUX return X so the return value would be implicit: (let ((x (foo))) (bar x) (quux-and-return x)) at which point we're back at the same line count as PROG1-LET, and have easier to read code. A "bind values, do stuff, return the bindings" -macro similar PROG1-LET would IMO fit fine in Alexandria, but PROG1-LET is not a good name for it. I also suspect it only gains true utility if it returns multiple values, but then we're back at looking for use-cases... Cheers, -- Nikodemus