Fix bogus and inconsistent translations of max and min
commit9a288cf44f4e8e160e0b6267aadc56fd271ec22d
authorKris Katterjohn <katterjohn@gmail.com>
Thu, 5 Mar 2020 22:33:28 +0000 (5 16:33 -0600)
committerKris Katterjohn <katterjohn@gmail.com>
Thu, 5 Mar 2020 22:33:28 +0000 (5 16:33 -0600)
tree2d16c2dae29278d9d861b4eb0eb709a1af2e8c37
parent0a1ee760de84fc8839a0bee6bfa03cd594056e18
Fix bogus and inconsistent translations of max and min

There were several related bugs in the translations of max and min:

1) In the case of mixed float and rational arguments (any case where
a rational argument was present and float contagion should be applied),
the translation was completely broken because the translated (Maxima)
rational arguments were not actually being converted to floats before
being passed to MAX or MIN.

2) In various cases with mixed argument modes, the return value was
not consistent with the interpreted case (example: an integer was
returned when interpreted but a float was returned when translated).

3) The mode used for the return value was not always correct with
mixed fixnum and float argument modes.  It was possible for the
translator to use a mode of float when the return value would
actually be a fixnum.

Bug cases 1 and 2 above were present in Macsyma.  Bug case 3 above
was not a bug under Maclisp because there MAX and MIN always return
a float when any argument is a float.

In Common Lisp, implementations have multiple choices they can make
about what MAX and MIN return under different circumstances.  The type
of the return value is not guaranteed when the arguments are a mix of
float and rational types.

To avoid implementation-dependent behavior of MAX and MIN, and to
have behavior consistent with the interpreted case, we are now more
conservative when translating max and min to MAX and MIN.  We now only
translate into MAX and MIN calls when every argument has the same mode
(either all fixnum or all float).

tests/rtest_translator.mac runs as expected, with new tests.
src/transl.lisp
tests/rtest_translator.mac