1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-29 19:30:36 +02:00
Commit graph

9559 commits

Author SHA1 Message Date
Andy Wingo
281aed8aa0 Simplify implementation of min, max
* libguile/numbers.c (scm_max, scm_min): Lean more on scm_is_less_than.
2022-01-13 09:37:16 +01:00
Andy Wingo
f507c97380 positive?, negative? use integer lib
* libguile/numbers.c (scm_positive_p, scm_negative_p): Use integer lib.
2022-01-13 09:37:16 +01:00
Andy Wingo
54d7722523 Clean up <, reimplement in terms of integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
44bee08512 Reimplement = on integer lib, clean up scm_num_eq_p
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
ef5ade30f9 Build scm_integer_p on scm_is_integer, not vice versa
* libguile/numbers.c: Switch layering of scm_is_integer /
scm_is_exact_integer and their SCM-valued counterparts.
2022-01-13 09:37:16 +01:00
Andy Wingo
24ce3cedfc Simplify scm_bigprint
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
fc36cd610d Implement integer-to-string with new integer library
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
fc4228c196 Implement scm_integer_length with new integer library
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
8b99ace658 Integer library takes bignums via opaque struct pointer
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
7ec40fe5b0 Implement scm_logcount with new integer library
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
88f56e91aa Implement scm_bit_extract with new integer library
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
35861b28bb Implement scm_ash with new integer library
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
3ad3ac740f Reimplement integer-expt in Scheme
* 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!
2022-01-13 09:37:16 +01:00
Andy Wingo
2d5dc6a14c Implement scm_modulo_expt with new integer library
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
b41714d277 Implement scm_lognot with new integer library
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
89cd48fcac Implement scm_logbit_p with new integer library
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
6298d73115 Implement scm_logtest with new integer library
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
459163fca1 Implement scm_logxor with new integer library
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
7e85ffa822 Implement scm_logior with new integer library
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
4a380aa6ac Implement scm_logand with new integer library
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
6fa9fcb313 Implement lcm with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
1e0797db72 Implement gcd with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
025c7c8045 Implement round-divide with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
b114642640 Implement round-remainder with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
9a358a9632 Implement round-quotient with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
ccb78fc7b1 Implement centered-divide with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
99b046d58b Implement centered-remainder with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
0ccdf06c81 Implement centered-quotient with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
f8a92773ac Implement truncate-divide with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
cbd62a0ef3 Implement truncate-remainder with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
ff636774b4 Implement truncate-quotient with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
1e1b230223 Implement ceiling-divide with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
55f93d7d29 Implement ceiling-remainder with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
c1d8dd5e6a Implement ceiling-quotient with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
8a63537458 Implement floor-divide with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
2e8036ff0f Implement floor-remainder with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
31da9be6c4 Implement floor-quotient with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
44c654aa3e Implement abs with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
5321899b9a Implement odd? and even? with new integer lib
* 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
c768115d93 Add new integers.[ch]
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
2022-01-13 09:37:16 +01:00
Andy Wingo
0e505b7036 Fix type confusion in heap-numbers-equal? calls from VM
When heap-numbers-equal? is called from eqv?, we have already ensured
that the both objects have the same heap type.  However when called by
the VM, the precondition is just that both are heap numbers -- not
necessarily of the same type.  Fix to add an additional check in
heap-numbers-equal?.  Could cause crashers!

* libguile/eq.c (scm_i_heap_numbers_equal_p): Add additional check.
2022-01-07 14:18:22 +01:00
Daniel Llorens
d70c1dbebf New function bitvector-copy (scm_bitvector_copy)
* libguile/bitvectors.h:
* libguile/bitvectors.c: As stated.
* test-suite/tests/bitvectors.test: Tests.
* doc/ref/api-data.texi: Update "Bit vectors" section.
* NEWS: Update.
2022-01-04 12:28:41 +01:00
Daniel Llorens
5759e37181 New function srfi-4-vector-type-size in (srfi srfi-4 gnu)
This patch removes the undocumented function make-srfi-4-vector from
(guile). That function is still exported from (srfi srfi-4 gnu).

* libguile/srfi-4.h (scm_init_srfi_4): Split into scm_bootstrap_srfi_4()
  and scm_init_srfi_4(), after the pattern of scm_init_bytevectors() and
  scm_bootstrap_bytevectors().
* libguile/init.c: Replace scm_init_srfi_4() call by scm_bootstrap_srfi_4().
* module/srfi/srfi-4.scm: Load newly defined srfi-4 extension. This
  provides undocumented make-srfi-4-vector.
* module/srfi/srfi-4/gnu.scm: Export srfi-4-vector-type-size.
* doc/ref/srfi-modules.texi: Document srfi-4-vector-type-size.
2021-12-06 14:00:03 +01:00
Daniel Llorens
496f69dba2 Support C99 complex types in (system foreign)
* libguile/foreign.h (SCM_FOREIGN_TYPE_COMPLEX_FLOAT,
  SCM_FOREIGN_TYPE_COMPLEX_DOUBLE): New enums.
* module/system/foreign.scm (complex-float, complex-double): Export new types.
  (make-c-struct, parse-c-struct): Support the new types.
* libguile/foreign.c (complex-float, complex-double): Define new types.
  (alignof, sizeof, pack, unpack): Support the new types.
* test-suite/tests/foreign.test: Test.
2021-11-15 11:34:09 +01:00
Daniel Llorens
24116be822 Fix brace style for bf9d30f3c3 2021-11-05 13:46:38 +01:00
Daniel Llorens
bf9d30f3c3 Limit the range of ash, round-ash count argument to INT32
This avoids gmp aborting e.g. with (ash 1 (expt 2 37)). The new limit is
such that (ash 1 (expt 30)) is accepted but (ash 1 (expt 31)) throws.

Fixes https://bugs.gnu.org/48150

* libguile/numbers.c (ash, round-ash): As stated.
* test-suite/tests/numbers.test: Test a case known to make gmp abort before.
2021-11-05 10:26:43 +01:00
d4ryus
1a8294f495 Fix bounds check in recvfrom!
Closes https://debbugs.gnu.org/cgi/bugreport.cgi?bug=45595.

NB: Amended by the committer to allow an empty range.

* libguile/socket.c: As stated.
2021-11-03 13:01:28 +01:00
Philipp Klaus Krause
ab9c0c9ca7 Const qualify return of strerror
Closes https://debbugs.gnu.org/cgi/bugreport.cgi?bug=43987
2021-11-03 11:59:15 +01:00
Daniel Llorens
6be51f9bbf Provide xxvector-copy and xxvector-copy! for srfi-4 vectors
These use the argument conventions of vector-copy!, string-copy!,
etc. and not that of bytevector-copy! (which is from r6rs).

* module/srfi/srfi-4/gnu.scm: As stated.
* test-suite/tests/srfi-4.test: Tests.
* doc/ref/srfi-modules.texi: Documentation.
* libguile/bytevectors.c (bytevector-copy!): Add overlap note to
  docstring.
* libguile/vectors.c (vector-copy!): Reuse text for the overlap note.
2021-10-21 15:05:46 +02:00
Andy Wingo
745b67c04a Add frame-local-ref / frame-local-set! support for type 'ptr
* libguile/frames.c (enum stack_item_representation):
(scm_to_stack_item_representation):
(scm_frame_local_ref):
(scm_frame_local_set_x): Add support for "ptr" representations.
2021-10-01 11:28:22 +02:00