[Openmcl-devel] Empty operands list on DIVISION-BY-ZERO signal
Gary Byers
gb at clozure.com
Wed Jun 29 17:15:07 PDT 2011
The ARITHMETIC-ERROR-OPERATION in your example is LOG, not /.
? (log 0)
> Error: DIVISION-BY-ZERO detected
> performing LOG on (0.0)
The spec defines ARITHMETIC-ERROR-OPERANDS and -OPERATION in terms of
"the offending call", but that term isn't well-defined. A
floating-point exception can (and sometimes is) raised by explicitly
setting a bit in a status register, and if there's a "call" involved
in that process it may not be a lisp function call ...
I don't think that you can assume that the offending call when a
DIVISION-BY-ZERO occurs is always a two-operand call to #'/. In cases
like:
? (/ 0)
and
? (/ 1 2 0)
an implementation could legitimately consider the offending call to be
one with 1 or 3 operands.
You can probably assume that, if C is an ARITHMETIC-ERROR,
(APPLY (ARITHMETIC-ERROR-OPERATION C) (ARITHMETIC-ERROR-OPERANDS C))
will generate the same type of ARITHMETIC-ERROR as C if that type of FP
exception is enabled. I don't think that you can safely assume much more
than that.
On Wed, 29 Jun 2011, Gabriel Dos Reis wrote:
> On Wed, Jun 29, 2011 at 2:24 PM, Gabriel Dos Reis <gdr at open-axiom.net> wrote:
>> On Wed, Jun 22, 2011 at 3:19 AM, Gary Byers <gb at clozure.com> wrote:
>>> See <http://trac.clozure.com/ccl/ticket/871>.
>>>
>>> On Mon, 20 Jun 2011, Gabriel Dos Reis wrote:
>>>
>>>> Hi,
>>>>
>>>> Clozure CL returns an empty list on the following form
>>>>
>>>> (handler-case (/ 1 0) (division-by-zero (c) (arithmetic-error-operands
>>>> c)))
>>>
>>
>> This appears indeed to be fixed on x86-64.
>> Thanks!
>
> One more thing: on DIVISION-BY-ZERO signal, how many arguments should
> I expect? I (naively?) thought I would get two, but with the form
>
> (handler-case (log 0) (division-by-zero (c) (arithmetic-error-operands c)))
>
> I get only one. Two operands would have been more useful.
>
> -- Gaby
>
>
More information about the Openmcl-devel
mailing list