mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-23 12:00:21 +02:00
Improve extensibility of expt' and
integer-expt'
* libguile/numbers.c (scm_integer_expt): No longer require that the first argument be a number, in order to improve extensibility. This allows us to efficiently raise arbitrary objects to an integer power as long as we can multiply those objects. For example, this allows us to efficiently exponentiate matrices if we define only multiplication methods for matrices. Note also that scm_expt calls this procedure whenever the exponent is an integer, regardless of the type of the first argument. Also rearrange the order in which we test special cases. * test-suite/tests/numbers.test (expt, integer-expt): Comment out tests that required `(expt #t 0)' and `(integer-expt #t 0)' to throw exceptions. Add tests for (expt #t 2) and `(integer-expt #t 2) instead. * NEWS: Add NEWS entry
This commit is contained in:
parent
05a5e5d6d0
commit
bfe1f03aac
3 changed files with 42 additions and 14 deletions
|
@ -3110,8 +3110,21 @@
|
|||
|
||||
(with-test-prefix "expt"
|
||||
(pass-if (documented? expt))
|
||||
(pass-if-exception "non-numeric base" exception:wrong-type-arg
|
||||
(expt #t 0))
|
||||
|
||||
;;
|
||||
;; expt no longer requires its first argument to be a scheme number,
|
||||
;; for the sake of extensibility, and expt calls integer-expt for
|
||||
;; integer powers. To raise to a positive power, all that is required
|
||||
;; is that it can be multiplied using `*'. For negative powers we
|
||||
;; must also be able to find the reciprocal. If we try to raise #t to
|
||||
;; any power other than 0 or 1 it may throw an exception, depending on
|
||||
;; whether * has been defined for #t. However, when raising to the 0
|
||||
;; or 1 power, the first argument is not manipulated at all.
|
||||
;;
|
||||
;; (pass-if-exception "non-numeric base" exception:wrong-type-arg
|
||||
;; (expt #t 0))
|
||||
;;
|
||||
|
||||
(pass-if (eqv? 1 (expt 0 0)))
|
||||
(pass-if (eqv? 1 (expt 0.0 0)))
|
||||
(pass-if (eqv? 1.0 (expt 0 0.0)))
|
||||
|
@ -3277,8 +3290,6 @@
|
|||
(with-test-prefix "integer-expt"
|
||||
(pass-if (documented? integer-expt))
|
||||
|
||||
(pass-if-exception "non-numeric base" exception:wrong-type-arg
|
||||
(integer-expt #t 0))
|
||||
(pass-if-exception "2^+inf" exception:wrong-type-arg
|
||||
(integer-expt 2 +inf.0))
|
||||
(pass-if-exception "2^-inf" exception:wrong-type-arg
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue