1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-19 02:00:26 +02:00

Simplify scm_difference, use integer lib

* libguile/numbers.c (scm_sum): Remove need for s_sum defines.
(negate, difference): New helpers.
(scm_difference): Call out to difference or negate, as appropriate.
* libguile/integers.h:
* libguile/integers.c (scm_integer_negate_i):
(scm_integer_negate_z):
(scm_integer_sub_ii):
(scm_integer_sub_iz):
(scm_integer_sub_zi):
(scm_integer_sub_zz): New internal functions.
This commit is contained in:
Andy Wingo 2022-01-04 16:01:28 +01:00
parent 10953e067c
commit c096670d38
3 changed files with 201 additions and 260 deletions

View file

@ -2559,3 +2559,47 @@ scm_integer_add_zz (struct scm_bignum *x, struct scm_bignum *y)
// if result is fixable.
return take_mpz (result);
}
SCM
scm_integer_negate_i (scm_t_inum x)
{
return long_to_scm (-x);
}
SCM
scm_integer_negate_z (struct scm_bignum *x)
{
/* Must normalize here because -SCM_MOST_NEGATIVE_FIXNUM is a bignum,
but negating that gives a fixnum. */
return normalize_bignum (negate_bignum (clone_bignum (x)));
}
SCM
scm_integer_sub_ii (scm_t_inum x, scm_t_inum y)
{
// Assumes that -INUM_MIN can fit in a scm_t_inum, even if that
// scm_t_inum is not fixable, and that scm_integer_add_ii can handle
// scm_t_inum inputs outside the fixable range.
return scm_integer_add_ii (x, -y);
}
SCM
scm_integer_sub_iz (scm_t_inum x, struct scm_bignum *y)
{
return scm_integer_add_zi (negate_bignum (clone_bignum (y)), x);
}
SCM
scm_integer_sub_zi (struct scm_bignum *x, scm_t_inum y)
{
// Assumes that -INUM_MIN can fit in a scm_t_inum, even if that
// scm_t_inum is not fixable, and that scm_integer_add_ii can handle
// scm_t_inum inputs outside the fixable range.
return scm_integer_add_zi (x, -y);
}
SCM
scm_integer_sub_zz (struct scm_bignum *x, struct scm_bignum *y)
{
return scm_integer_add_zz (x, negate_bignum (clone_bignum (y)));
}