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

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.
This commit is contained in:
Daniel Llorens 2021-12-06 13:38:37 +01:00
parent 6af3362b05
commit 5759e37181
8 changed files with 63 additions and 6 deletions

6
NEWS
View file

@ -28,7 +28,7 @@ This function was undocumented.
* New interfaces and functionality
** Typed vector copy functions
** Typed vector copy functions in (srfi srfi-4 gnu)
The functions `u8vector-copy' `s8vector-copy' `u16vector-copy'
`s16vector-copy' `u32vector-copy' `s32vector-copy' `u64vector-copy'
@ -39,6 +39,10 @@ The functions `u8vector-copy' `s8vector-copy' `u16vector-copy'
`f64vector-copy!' `c32vector-copy!' `c64vector-copy!' have been
added. See SRFI-4 - Guile extensions" in the manual.
** New function srfi-4-vector-type-size in (srfi srfi-4 gnu)
See SRFI-4 - Guile extensions" in the manual.
** `bytevector-fill!' supports partial fill through optional arguments
This is an extension to the r6rs procedure. See "Manipulating

View file

@ -1776,6 +1776,12 @@ module:
(use-modules (srfi srfi-4 gnu))
@end example
@deffn {Scheme Procedure} srfi-4-vector-type-size obj
Return the size, in bytes, of each element of SRFI-4 vector
@var{obj}. For example, @code{(srfi-4-vector-type-size #u32())} returns
@code{4}.
@end deffn
@deffn {Scheme Procedure} any->u8vector obj
@deffnx {Scheme Procedure} any->s8vector obj
@deffnx {Scheme Procedure} any->u16vector obj

View file

@ -449,7 +449,7 @@ scm_i_init_guile (void *base)
scm_init_vectors (); /* Requires array-handle, */
scm_init_uniform ();
scm_init_bitvectors (); /* Requires smob_prehistory, array-handle */
scm_init_srfi_4 (); /* Requires smob_prehistory, array-handle */
scm_bootstrap_srfi_4 (); /* Requires smob_prehistory, array-handle */
scm_init_arrays (); /* Requires smob_prehistory, array-handle */
scm_init_array_map ();

View file

@ -37,6 +37,7 @@
#include "numbers.h"
#include "uniform.h"
#include "variable.h"
#include "version.h"
#include "srfi-4.h"
@ -277,8 +278,21 @@ SCM_DEFINE (scm_make_srfi_4_vector, "make-srfi-4-vector", 2, 1, 0,
}
#undef FUNC_NAME
SCM_DEFINE (scm_srfi_4_vector_type_size, "srfi-4-vector-type-size", 1, 0, 0,
(SCM vec),
"Return the size, in bytes, of each element of a srfi-4 vector.")
#define FUNC_NAME s_scm_srfi_4_vector_type_size
{
SCM_VALIDATE_BYTEVECTOR (1, vec);
return scm_from_size_t (SCM_BYTEVECTOR_TYPE_SIZE (vec));
}
#undef FUNC_NAME
/* Initialization. */
void
scm_init_srfi_4 (void)
scm_bootstrap_srfi_4 (void)
{
#define REGISTER(tag, TAG) \
scm_i_register_vector_constructor \
@ -298,6 +312,15 @@ scm_init_srfi_4 (void)
REGISTER (c32, C32);
REGISTER (c64, C64);
scm_c_register_extension ("libguile-" SCM_EFFECTIVE_VERSION,
"scm_init_srfi_4",
(scm_t_extension_init_func) scm_init_srfi_4,
NULL);
}
void
scm_init_srfi_4 (void)
{
#include "srfi-4.x"
}

View file

@ -25,6 +25,7 @@
#include "libguile/array-handle.h"
SCM_API SCM scm_make_srfi_4_vector (SCM type, SCM len, SCM fill);
SCM_API SCM scm_srfi_4_vector_type_size (SCM vec);
/* Specific procedures.
*/
@ -60,6 +61,7 @@ SCM_SRFI4_DECL (c64, double)
#undef SCM_SRFI4_DECL
SCM_INTERNAL void scm_bootstrap_srfi_4 (void);
SCM_INTERNAL void scm_init_srfi_4 (void);
#endif /* SCM_SRFI_4_H */

View file

@ -116,3 +116,6 @@
(define-bytevector-type s64 s64-native 8)
(define-bytevector-type f32 ieee-single-native 4)
(define-bytevector-type f64 ieee-double-native 8)
(load-extension (string-append "libguile-" (effective-version))
"scm_init_srfi_4")

View file

@ -33,8 +33,6 @@
c64vector? make-c64vector c64vector c64vector-length c64vector-ref
c64vector-set! c64vector->list list->c64vector
make-srfi-4-vector
;; Somewhat polymorphic conversions.
any->u8vector any->s8vector any->u16vector any->s16vector
any->u32vector any->s32vector any->u64vector any->s64vector
@ -48,10 +46,14 @@
;; copy range with destination
u8vector-copy! s8vector-copy! u16vector-copy! s16vector-copy!
u32vector-copy! s32vector-copy! u64vector-copy! s64vector-copy!
f32vector-copy! f64vector-copy! c32vector-copy! c64vector-copy!))
f32vector-copy! f64vector-copy! c32vector-copy! c64vector-copy!
;; from libguile
srfi-4-vector-type-size make-srfi-4-vector))
(define make-srfi-4-vector (@@ (srfi srfi-4) make-srfi-4-vector))
(define srfi-4-vector-type-size (@@ (srfi srfi-4) srfi-4-vector-type-size))
(define (bytevector-c32-native-ref v i)
(make-rectangular (bytevector-ieee-single-native-ref v i)

View file

@ -564,3 +564,20 @@
(s8vector-copy! v 2 #s8(-1 -2 -3 -4 -5))
(equal? #s8(9 7 -1 -2 -3 -4 -5 8) v))))
(with-test-prefix "srfi-4 type size"
(pass-if "c64vector"
(= 16 (srfi-4-vector-type-size #c64())))
(pass-if "c32vector"
(= 8 (srfi-4-vector-type-size #c32())))
(pass-if "f32vector"
(= 4 (srfi-4-vector-type-size #f32())))
(pass-if "u16vector"
(= 2 (srfi-4-vector-type-size #u16())))
(pass-if "s8vector"
(= 1 (srfi-4-vector-type-size #s8()))))