[quiz] [QUIZ 5b & 5e] [SPOILER] Date differences, and betting

Ivan Salazar ivan.salazarv at gmail.com
Tue Jul 24 19:22:35 UTC 2007


>
> > Off topic: I am reading Paul Graham's ANSI Common Lisp and I have a
> > little question: why does he uses a lot (at least until chapter 4)
> > "and" clauses when I think he should use the "when" macro? For
> > example, in this code snip from figure 4.1:
> >
> > ;; This is a binary search algorithm as you may guess.
> > (defun bin-search (obj vec)
> >  (let ((len (length vec)))
> >    (and (not (zerop len))  ;Here is the and clause that I may change for
> >                            ;a when
> >         (finder obj vec 0 (- len 1)))))
> >
> > (defun finder (obj vec start end)
> >   ...)
> >
> > I've read that at least three times I think and it seems that there
> > will be more.
> > I know that the and clause gives the desired behavior of returning
> > the last value that satisfies it or the first one that doesn't, but
> > I would have used a when for some of the cases I've read (it is more
> > readable for me, I think).
> > Is he using the and clause for some reason that eludes me or is it
> > just a personal taste?
>
> In many cases I think it's just personal taste, i.e., a style issue
> like the one I mentioned above.
>
> But maybe not.  If you consider the published code as a snapshot of a
> real application, some method to this madness emerges (maybe).  In
> particular, consider the code over time.  Perhaps he started out with
>
>   (and (not (zerop len))
>        (other code)
>        (finder obj vec 0 (- len 1)))
>
> and then deleted the second clause.  Maybe he didn't want to change
> it.  Maybe he thought he might, at some later date, have to add some
> more code in the middle.  Once you shift back and forth between
>
>   (when (foo)
>     (baz))
>
> and
>
>   (when (and (foo) (bar))
>     (baz))
>
> enough times, you start to want to skip the middle man and just go for
>
>   (and (foo)
>        (baz))
>
> every time, in case you have to add the middle (bar) later.
>
> Or so it seems to me, anyway.  :)
>
> I haven't really thought about it all that much, but I might use the
> following rule of thumb: Start out with
>
>   (when (foo)
>     (baz))
>
> The first time you have to change it to
>
>   (when (and (foo) (bar))
>     (baz))
>
> change it to
>
>   (and (foo)
>        (bar)
>        (baz))
>
> instead and leave it that way forever after.  If it has changed once,
> it'll probably change again.  :)
>
> -- Larry
>
> _______________________________________________
> quiz mailing list
> quiz at common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/quiz
>

Outstanding. Thanks for the answer, Larry. I was starting to think that was
the answer, but you stated it very clear.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/quiz/attachments/20070724/e2f26ee1/attachment.html>


More information about the Quiz mailing list