[Openmcl-devel] Shortcircuiting of argument evaluation in #'<

Pascal J. Bourguignon pjb at informatimago.com
Wed Jan 9 11:06:06 PST 2013

Ron Garret <ron at flownet.com> writes:

> On Jan 9, 2013, at 7:49 AM, Stas Boukarev wrote:
>> Ron Garret <ron at flownet.com> writes:
>>> IMO this is a bug in the spec, not CCL.  (< a b c ...) ought to mean
>>> (and (< a b) (< b c) ...) , not (let* ((a_ a) (b_ b) ...) (< a_ b_ c_
>>> ...)).  Putting side-effecting code inside a comparison operator is a
>>> Truly Horrible Idea (which is even worse than the previously
>>> trademarked Really Bad Idea) and any programmer who wants to write
>>> code that relies on it ought to bear the burden of expanding his code
>>> into the corresponding LET* rather than impose the burden of running
>>> dead code on the entire extant code base.  That is too high a price to
>>> pay.  The spec is not scripture.
>> Are you being serious?
> Yes.
>> < is an ordinary function, and the order of argument
>> evaluation and guarantee of evaluation is exactly prescribed by the
>> standard. What's the big idea of randomly disregarding the standard?
> I am not "randomly" disregarding the spec.  I am observing that the
> spec as written requires the execution of dead code when comparison
> operators are used in idiomatic ways.  Further, I am opining that
> requiring the execution of dead code is stupid, and suggesting that
> this part of the spec is a bug and SHOULD be disregarded FOR THAT
> I understand that I am very likely to lose this argument, but I just
> wanted to express my opinion that CCL's current behavior is preferable
> to what the spec requires.

Oh, and of course, you can always write:

    (< 1 0 (error "Duh!"))


    (and (< 1 0) (< 0 (error "Re-Duh!")))

to mean the former or the later!

__Pascal Bourguignon__                     http://www.informatimago.com/
A bad day in () is better than a good day in {}.

More information about the Openmcl-devel mailing list