[Cuis-dev] New updates posted on Github

Hernan Wilkinson hernan.wilkinson at 10pines.com
Wed Jun 26 14:35:35 PDT 2019


Great job!!

On Wed, Jun 26, 2019 at 6:05 PM Gastón Caruso via Cuis-dev <
cuis-dev at lists.cuis.st> wrote:

> Awesome! thanks for the report! 👏
>
> > On 26 Jun 2019, at 16:04, Juan Vuletich via Cuis-dev <
> cuis-dev at lists.cuis.st> wrote:
> >
> > Hello,
> >
> > I had a chance to work on a few things with Andres Valloud, here is his
> summary of what we just posted on Github.
> >
> > First, we turned Complex into a loadable package once more.  Usually the
> disadvantage is that loading such packages results in code overrides.  For
> instance, since the message sqrt will have to change behavior (so that -1
> sqrt returns a complex number, rather than fail outright), one would expect
> that loading Complex would have to modify the base system to introduce the
> new feature.  This time, however, we engineered how Complex interacts with
> the rest of the system so that loading the Complex package does not result
> in any base system code modifications.  Of course, loading Complex causes
> -1 sqrt to evaluate to 0 + 1i, as before.
> >
> > The key to accomplishing this was to introduce a new exception,
> NegativePowerError, which by default comes in without a defaultAction
> method.  When Complex loads, it simply provides defaultAction so that said
> exceptions are handled by invoking complex number arithmetic.  We hope this
> mechanism illustrates one way of making different code packages coexist
> more harmoniously.  Please include Complex as a requirement to your
> packages as appropriate.
> >
> > Second, and along the same lines, we also found that the arithmetic
> error exceptions looked very similar and yet their implementation was very
> different.  Further, there were some discrepancies in how they were used
> and handled (some would do things like ^ZeroDivide signal..., and some
> others simply ZeroDivide signal...).  In addition, for floating point
> numbers, some of the results were not following the IEEE spec.
> >
> > As an aside, it seems trivial, but even the following four operations
> require *substantial* spec lawyering to get right:
> >
> > 0.0 - 0.0
> > 0.0 - -0.0
> > -0.0 - 0.0
> > -0.0 - -0.0
> >
> > Looks trivial --- it isn't.  And then you consider +, /, and *.  So, we
> reorganized these exceptions under a general class called
> ArithmeticMessageError.  This new abstract exception has three instance
> variables that will look familiar immediately: receiver, message, and
> arguments.  These are provided by the location where the exception occurs,
> which in turn allows e.g. defaultAction to resume the computation as
> required without having to either a) guess what went wrong, or b) needing a
> multitude of different exceptions depending on what actually happened.
> Currently, ArithmeticMessageError has two subclasses for situations that
> are special enough to deserve their own class: division by zero, and
> raising a negative number to powers.
> >
> > In the "rationals" (i.e. Integer and Fraction), things like 1/0 are
> undefined. But in floating point land, dividing aFloat by zero can be one
> of three things (!): +INF, -INF, and NaN.  No, this was not our idea, but
> we care that things work according to the manual so that our system enables
> as many folks as possible.  Since floating point requires special handling,
> there is a ZeroDivide exception to do so.  Something similar happens with
> NegativePowerError.  In the "rationals", things like -8 raisedTo: 1/3 make
> sense.  That's because, generally,
> >
> > a^(p/q) = (a^p)^1/q
> >
> > Note the sign of the result, when it is defined, depends on the sign of
> a and (essentially) the "parity" of p/q.  Again, this was not our idea, but
> we gather the world mostly works this way :).
> >
> > With floating point numbers, however, it's not obvious what a^b is when
> a and b are floating point numbers.  Suppose a is negative, and b is 1.0 /
> 3.0.  Looking at that floating point 1/3, does that mean that if the last
> bit of the mantissa is zero, that the result does not exist?  And that if
> the last bit of the mantissa is 1, then it's ok to take something *like*
> the cubic root of a?  What does that even mean when b is the result of who
> knows how many operations, each of which is presumably on the order of one
> ulp off?  Thus, said powers fail, and the result is NaN for floating point
> numbers.
> >
> > If you are curious, consider the fantastic behavior of the following two
> examples.  Both fail gracefully, as they should.
> >
> > -32 raisedTo: (1/5.0) asTrueFraction
> > -32 raisedTo: (1/5.0) successor asTrueFraction
> >
> > Note that if Complex is loaded, however, a^b will happily work for
> floating point numbers and produce complex numbers, as expected.  For
> instance, take G_6.  Since -8 is 8 * w_3, then one of the possible cubic
> roots is 2 * w_2 (and so is 2 * w_5).
> >
> > If this behavior does not work for you, look for the relevant
> defaultAction method, and also take a look at floatErrorValue.  We tried to
> make these moldable and easy to change so that people can configure the
> system to their liking, while requiring minimal modifications.
> >
> > Third, all these improvements to exceptions brought up the problem that
> SUnit was catching errors by handling Error.  This is not ideal because, as
> just exemplified above, any exception can provide a defaultAction method
> that recovers its occurrence.  But handling Error like this:
> >
> > [3 / 0] on: Error do: [:ex | ex return: 'everybody knows this is bad']
> >
> > prevents Error from running its defaultAction, and so a recoverable
> error always becomes an unrecoverable error.  Instead, the above code
> should say this:
> >
> > [3 / 0] on: UnhandledError do: [:ex | ex return: 'evidently this error
> was unexpected']
> >
> > Consequently, TestResult exError should answer UnhandledError, rather
> than Error.  We applied this change.  Please consider how you handle
> exceptions with these observations in mind to maximize flexibility and
> robustness.
> >
> > Andres thinking the above should be at least mostly correct, Juan
> approving without being too worried.
> >
> > --
> > Cuis-dev mailing list
> > Cuis-dev at lists.cuis.st
> > https://lists.cuis.st/mailman/listinfo/cuis-dev
>
> --
> Cuis-dev mailing list
> Cuis-dev at lists.cuis.st
> https://lists.cuis.st/mailman/listinfo/cuis-dev
>


-- 

*Hernán WilkinsonAgile Software Development, Teaching & Coaching*
*Phone: +54-011*-4893-2057
*Twitter: @HernanWilkinson*
*site: http://www.10Pines.com <http://www.10pines.com/>*
Address: Alem 896, Floor 6, Buenos Aires, Argentina
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20190626/111e3697/attachment-0001.htm>


More information about the Cuis-dev mailing list