summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
* Reimplement scm_is_{un,}signed_integer for bignumsAndy Wingo2022-01-133-74/+120
| | | | | | | | | | | | | | * libguile/integers.c (negative_int64): (int64_magnitude): (negative_uint64_to_int64): (positive_uint64_to_int64): (bignum_to_int64): (bignum_to_uint64): New helpers. (scm_integer_to_int64_z): (scm_integer_to_uint64_z): New internal functions. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_is_signed_integer): (scm_is_unsigned_integer): Simplify bigint cases.
* Fix scm_integer_to_double_z to always round; clean upsAndy Wingo2022-01-135-103/+110
| | | | | | | | | | | | | | * libguile/integers.c (scm_integer_to_double_z): Doubles that can't be exactly represented as integers should round. (bignum_frexp_z): New helper. (scm_integer_from_mpz, scm_integer_from_double): New internal functions. * libguile/numbers.h: * libguile/numbers.c (scm_i_bigcmp, scm_i_dbl2big, scm_i_dbl2num): Remove unused internal functions. (scm_inexact_to_exact): Rework to avoid scm_i_dbl2big. (scm_bigequal): Move here, from eq.c. (scm_integer_to_double_z): Use the new helper. (scm_i_big2dbl): Use scm_integer_to_double_z.
* Fix deprecated bit-count* when counting 0 bitsAndy Wingo2022-01-131-2/+2
| | | | | * libguile/deprecated.c (scm_bit_count_star): Fix logic to count 0 bits.
* Clean up scm_divideAndy Wingo2022-01-133-223/+252
| | | | | | | | | | * libguile/integers.h: * libguile/integers.c (scm_is_integer_divisible_ii): (scm_is_integer_divisible_zi): (scm_is_integer_divisible_zz): New helpers. * libguile/numbers.c (invert, divide, complex_div): New helpers for scm_divide. (scm_divide): Adapt.
* Remove support for allowing exact numbers to be divided by zeroAndy Wingo2022-01-131-102/+18
| | | | | | | | * libguile/numbers.c: We require IEEE infinities and NaN so there is no case in which ALLOW_DIVIDE_BY_ZERO would not be defined. (scm_divide, scm_tan, scm_tanh, scm_log, scm_log10): Always throw on overflow for divide by exact zero, never throw for divide by inexact zero.
* Simplify scm_product, use integer libAndy Wingo2022-01-133-189/+147
| | | | | | | | | | * libguile/numbers.c (scm_product): Remove need for s_product defines. Call out to product, as appropriate. (product): New helper. * libguile/integers.h: * libguile/integers.c (scm_integer_mul_ii): (scm_integer_mul_zi): (scm_integer_mul_zz): New internal functions.
* Simplify scm_difference, use integer libAndy Wingo2022-01-133-233/+174
| | | | | | | | | | | | | * 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.
* Clean up scm_sumAndy Wingo2022-01-133-144/+126
| | | | | | | | | | | | * libguile/integers.h: * libguile/integers.c (scm_integer_to_double_z): (scm_integer_add_ii, scm_integer_add_zi, scm_integer_add_zz): New internal functions. * libguile/numbers.c (sum): New helper for scm_sum. Clean up to avoid repetition. The dispatch is less optimal but the code is shorter and more maintainable; in any case if speed is important, the compiler needs to be involved. (scm_sum): Adapt.
* Simplify implementation of min, maxAndy Wingo2022-01-131-283/+47
| | | | * libguile/numbers.c (scm_max, scm_min): Lean more on scm_is_less_than.
* positive?, negative? use integer libAndy Wingo2022-01-131-10/+2
| | | | * libguile/numbers.c (scm_positive_p, scm_negative_p): Use integer lib.
* Clean up <, reimplement in terms of integer libAndy Wingo2022-01-133-178/+200
| | | | | | | | | | | | | | | | | * libguile/numbers.c (scm_is_less_than, scm_is_greater_than): (scm_is_less_than_or_equal, scm_is_greater_than_or_equal): New internal functions. (scm_less_p, scm_gr_p, scm_leq_p, scm_geq_p): Use new helpers. Dispatch to generics if operands aren't real -- a tightening relative to the previous check which was just for numbers. * libguile/integers.h: * libguile/integers.c (scm_is_integer_less_than_ir): (scm_is_integer_less_than_ri): (scm_is_integer_less_than_zz): (scm_is_integer_less_than_zr): (scm_is_integer_less_than_rz): (scm_is_integer_positive_z): (scm_is_integer_negative_z): New internal functions.
* Reimplement = on integer lib, clean up scm_num_eq_pAndy Wingo2022-01-133-154/+99
| | | | | | | | | | | * libguile/integers.h: * libguile/integers.c (scm_is_integer_equal_ir): (scm_is_integer_equal_ic): (scm_is_integer_equal_zz): (scm_is_integer_equal_zr): (scm_is_integer_equal_zc): New internal functions. * libguile/numbers.c (scm_num_eq_p): Rework to tail-recurse if we need to swap arguments, to reduce duplication, and use the new integer lib.
* Build scm_integer_p on scm_is_integer, not vice versaAndy Wingo2022-01-131-15/+11
| | | | | * libguile/numbers.c: Switch layering of scm_is_integer / scm_is_exact_integer and their SCM-valued counterparts.
* Simplify scm_bigprintAndy Wingo2022-01-131-7/+2
| | | | | | * libguile/numbers.c (scm_bigprint): Just convert the number to a string and write that. Adds a copy but if we optimize scm_integer_to_string_z then that will be fixed.
* Implement integer-to-string with new integer libraryAndy Wingo2022-01-133-21/+35
| | | | | | | | * libguile/integers.c (scm_integer_to_string_i) (scm_integer_to_string_z): New internal functions. * libguile/integers.h: Declare the new internal functions. * libguile/numbers.c (scm_number_to_string): Use new internal functions.
* Implement scm_integer_length with new integer libraryAndy Wingo2022-01-133-33/+42
| | | | | | | * libguile/integers.c (scm_integer_length_i) (scm_integer_length_z): New internal functions. * libguile/integers.h: Declare the new internal functions. * libguile/numbers.c (scm_integer_length): Use new internal functions.
* Integer library takes bignums via opaque struct pointerAndy Wingo2022-01-133-377/+365
| | | | | | | | * libguile/integers.h (scm_bignum): Declare opaque struct type and a function to cast SCM to this type. Adapt all routines that take bignums to take a "struct scm_bignum *". * libguile/integers.c: Adapt. * libguile/numbers.c: Adapt all users.
* Implement scm_logcount with new integer libraryAndy Wingo2022-01-133-32/+42
| | | | | | | * libguile/integers.c (scm_integer_logcount_i) (scm_integer_logcount_z): New internal functions. * libguile/integers.h: Declare the new internal functions. * libguile/numbers.c (scm_logcount): Use new internal functions.
* Implement scm_bit_extract with new integer libraryAndy Wingo2022-01-133-53/+63
| | | | | | | * libguile/integers.c (scm_integer_bit_extract_i) (scm_integer_bit_extract_z): New internal functions. * libguile/integers.h: Declare the new internal functions. * libguile/numbers.c (scm_bit_extract): Use new internal functions.
* Implement scm_ash with new integer libraryAndy Wingo2022-01-133-148/+162
| | | | | | | | | * libguile/integers.c (scm_integer_lsh_iu, scm_integer_lsh_zu) (scm_integer_floor_rsh_iu, scm_integer_floor_rsh_zu) (scm_integer_round_rsh_iu, scm_integer_round_rsh_zu): New internal functions. * libguile/integers.h: Declare the new internal functions. * libguile/numbers.c (scm_ash): Use new internal functions.
* Reimplement integer-expt in SchemeAndy Wingo2022-01-132-121/+57
| | | | | | | | * libguile/numbers.c (integer_expt_var): New static variable. (init_integer_expt_var): New helper. (scm_integer_expt): Delegate to Scheme. * module/ice-9/boot-9.scm (integer-expt): Reimplement in Scheme. Misses some optimizations for fractions but that is probably OK!
* Implement scm_modulo_expt with new integer libraryAndy Wingo2022-01-133-103/+66
| | | | | | | * libguile/integers.c (scm_integer_modulo_expt_nnn): (integer_init_mpz): New helper. * libguile/integers.h: Declare the new internal function. * libguile/numbers.c (scm_modulo_expt): Use new internal function.
* Implement scm_lognot with new integer libraryAndy Wingo2022-01-133-15/+25
| | | | | | * libguile/integers.c (scm_integer_lognot_i, scm_integer_lognot_z): * libguile/integers.h: Declare the new internal functions. * libguile/numbers.c (scm_lognot): Use new internal functions.
* Implement scm_logbit_p with new integer libraryAndy Wingo2022-01-133-16/+25
| | | | | | * libguile/integers.c (scm_integer_logbit_ui, scm_integer_logbit_uz): * libguile/integers.h: Declare the new internal functions. * libguile/numbers.c (scm_logbit_p): Use new internal functions.
* Implement scm_logtest with new integer libraryAndy Wingo2022-01-133-39/+28
| | | | | | | * libguile/integers.c (scm_integer_logtest_ii, scm_integer_logtest_zi) (scm_integer_logtest_zz): New internal functions. * libguile/integers.h: Declare the new internal functions. * libguile/numbers.c (scm_logtest): Use new internal functions.
* Implement scm_logxor with new integer libraryAndy Wingo2022-01-133-32/+39
| | | | | | | * libguile/integers.c (scm_integer_logxor_ii, scm_integer_logxor_zi) (scm_integer_logxor_zz): New internal functions. * libguile/integers.h: Declare the new internal functions. * libguile/numbers.c (scm_logxor): Use new internal functions.
* Implement scm_logior with new integer libraryAndy Wingo2022-01-133-36/+42
| | | | | | | * libguile/integers.c (scm_integer_logior_ii, scm_integer_logior_zi) (scm_integer_logior_zz): New internal functions. * libguile/integers.h: Declare the new internal functions. * libguile/numbers.c (scm_logior): Use new internal functions.
* Implement scm_logand with new integer libraryAndy Wingo2022-01-133-33/+79
| | | | | | | * libguile/integers.c (scm_integer_logand_ii, scm_integer_logand_zi) (scm_integer_logand_zz): New internal functions. * libguile/integers.h: Declare the new internal functions. * libguile/numbers.c (scm_logand): Use new internal functions.
* Implement lcm with new integer libAndy Wingo2022-01-133-39/+50
| | | | | | | * libguile/integers.c (scm_integer_lcm_ii) (scm_integer_lcm_zi, scm_integer_lcm_zz): New internal functions. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_lcm): Use the new functions.
* Implement gcd with new integer libAndy Wingo2022-01-133-81/+86
| | | | | | | * libguile/integers.c (scm_integer_gcd_ii) (scm_integer_gcd_zi, scm_integer_gcd_zz): New internal functions. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_gcd): Use the new functions.
* Implement round-divide with new integer libAndy Wingo2022-01-133-123/+140
| | | | | | | | | | * libguile/integers.c (scm_integer_round_divide_ii) (scm_integer_round_divide_iz, scm_integer_round_divide_zi) (scm_integer_round_divide_zz): New internal functions. (integer_round_divide_zz): New helper. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_round_divide): Use the new functions. (scm_i_bigint_round_divide): Remove unused helper.
* Implement round-remainder with new integer libAndy Wingo2022-01-133-114/+130
| | | | | | | | | | | * libguile/integers.c (scm_integer_round_remainder_ii) (scm_integer_round_remainder_iz, scm_integer_round_remainder_zi) (scm_integer_round_remainder_zz): New internal functions. (integer_round_remainder_zz): New helper. (long_sign, bignum_cmp_long): New helpers. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_round_remainder): Use the new functions. (scm_i_bigint_round_remainder): Remove unused helper.
* Implement round-quotient with new integer libAndy Wingo2022-01-133-119/+154
| | | | | | | | | | | * libguile/integers.c (scm_integer_round_quotient_ii) (scm_integer_round_quotient_iz, scm_integer_round_quotient_zi) (scm_integer_round_quotient_zz): New internal functions. (integer_round_quotient_zz): New helper. (long_sign, bignum_cmp_long): New helpers. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_round_quotient): Use the new functions. (scm_i_bigint_round_quotient): Remove unused helper.
* Implement centered-divide with new integer libAndy Wingo2022-01-133-143/+151
| | | | | | | | | | * libguile/integers.c (scm_integer_centered_divide_ii) (scm_integer_centered_divide_iz, scm_integer_centered_divide_zi) (scm_integer_centered_divide_zz): New internal functions. (integer_centered_divide_zz): New helper. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_centered_divide): Use the new functions. (scm_i_bigint_centered_divide): Remove unused helper.
* Implement centered-remainder with new integer libAndy Wingo2022-01-133-117/+127
| | | | | | | | | * libguile/integers.c (scm_integer_centered_remainder_ii) (scm_integer_centered_remainder_iz, scm_integer_centered_remainder_zi) (scm_integer_centered_remainder_zz): New internal functions. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_centered_remainder): Use the new functions. (scm_i_bigint_centered_remainder): Remove helper.
* Implement centered-quotient with new integer libAndy Wingo2022-01-133-138/+144
| | | | | | | | | * libguile/integers.c (scm_integer_centered_quotient_ii) (scm_integer_centered_quotient_iz, scm_integer_centered_quotient_zi) (scm_integer_centered_quotient_zz): New internal functions. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_centered_quotient): Use the new functions. (scm_i_bigint_centered_quotient): Remove unused helper.
* Implement truncate-divide with new integer libAndy Wingo2022-01-133-68/+90
| | | | | | | | * libguile/integers.c (scm_integer_truncate_divide_ii) (scm_integer_truncate_divide_iz, scm_integer_truncate_divide_zi) (scm_integer_truncate_divide_zz): New internal functions. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_truncate_divide): Use the new functions.
* Implement truncate-remainder with new integer libAndy Wingo2022-01-133-45/+68
| | | | | | | | * libguile/integers.c (scm_integer_truncate_remainder_ii) (scm_integer_truncate_remainder_iz, scm_integer_truncate_remainder_zi) (scm_integer_truncate_remainder_zz): New internal functions. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_truncate_remainder): Use the new functions.
* Implement truncate-quotient with new integer libAndy Wingo2022-01-133-58/+77
| | | | | | | | * libguile/integers.c (scm_integer_truncate_quotient_ii) (scm_integer_truncate_quotient_iz, scm_integer_truncate_quotient_zi) (scm_integer_truncate_quotient_zz): New internal functions. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_truncate_quotient): Use the new functions.
* Implement ceiling-divide with new integer libAndy Wingo2022-01-133-124/+146
| | | | | | | | * libguile/integers.c (scm_integer_ceiling_divide_ii) (scm_integer_ceiling_divide_iz, scm_integer_ceiling_divide_zi) (scm_integer_ceiling_divide_zz): New internal functions. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_ceiling_divide): Use the new functions.
* Implement ceiling-remainder with new integer libAndy Wingo2022-01-133-85/+108
| | | | | | | | | * libguile/integers.c (scm_integer_ceiling_remainder_ii) (scm_integer_ceiling_remainder_iz, scm_integer_ceiling_remainder_zi) (scm_integer_ceiling_remainder_zz): New internal functions. (bignum_is_positive): New helper. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_ceiling_remainder): Use the new functions.
* Implement ceiling-quotient with new integer libAndy Wingo2022-01-133-97/+138
| | | | | | | | | | | * libguile/integers.c (scm_integer_ceiling_quotient_ii) (scm_integer_ceiling_quotient_iz, scm_integer_ceiling_quotient_zi) (scm_integer_ceiling_quotient_zz): New internal functions. (take_bignum_from_mpz): Change to also normalize the mpz, as all callers required. (long_sign, bignum_cmp_long): New helpers. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_ceiling_quotient): Use the new functions.
* Implement floor-divide with new integer libAndy Wingo2022-01-133-97/+111
| | | | | | | | * libguile/integers.c (scm_integer_floor_divide_ii) (scm_integer_floor_divide_iz, scm_integer_floor_divide_zi) (scm_integer_floor_divide_zz): New internal functions. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_floor_divide): Use the new functions.
* Implement floor-remainder with new integer libAndy Wingo2022-01-133-71/+86
| | | | | | | | * libguile/integers.c (scm_integer_floor_remainder_ii) (scm_integer_floor_remainder_iz, scm_integer_floor_remainder_zi) (scm_integer_floor_remainder_zz): New internal functions. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_floor_remainder): Use the new functions.
* Implement floor-quotient with new integer libAndy Wingo2022-01-133-67/+92
| | | | | | | | | * libguile/integers.c (scm_integer_floor_quotient_ii) (scm_integer_floor_quotient_iz, scm_integer_floor_quotient_zi) (scm_integer_floor_quotient_zz): New internal functions. (long_to_scm, ulong_to_scm, take_bignum_from_mpz): New helpers. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_floor_quotient): Use the new functions.
* Implement abs with new integer libAndy Wingo2022-01-133-16/+27
| | | | | | | * libguile/integers.c (scm_integer_abs_i, scm_integer_abs_z): New internal functions. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_abs): Use the new functions.
* Implement odd? and even? with new integer libAndy Wingo2022-01-133-19/+220
| | | | | | | | * libguile/integers.c (scm_is_integer_odd_i): (scm_is_integer_odd_z): New internal functions. Add a number of internal support routines. * libguile/integers.h: Declare internal functions. * libguile/numbers.c (scm_odd_p, scm_even_p): Use the new functions.
* Add new integers.[ch]Andy Wingo2022-01-133-1/+66
| | | | | | | | | The goal is to factor out some fixnum/bignum code here from numbers.[ch]. * libguile/Makefile.am: Add new files. * libguile/integers.c: * libguile/integers.h: New files
* Avoid quadratic behavior in id-var-nameAndy Wingo2022-01-132-60/+67
| | | | | * module/ice-9/psyntax.scm (id-var-name): Avoid list-ref. * module/ice-9/psyntax-pp.scm: Regenerate.
* -Oresolve-free-vars pass gracefully handles failed autoloads.Andy Wingo2022-01-111-15/+21
| | | | | * module/language/tree-il/resolve-free-vars.scm (make-resolver): Gracefully handle failed autoloads.