Previous: Vector Accessors, Up: Vectors
A vector can be read and modified from C with the functions
scm_c_vector_ref
and scm_c_vector_set_x
, for example. In
addition to these functions, there are two more ways to access vectors
from C that might be more efficient in certain situations: you can
restrict yourself to simple vectors and then use the very fast
simple vector macros; or you can use the very general framework
for accessing all kinds of arrays (see Accessing Arrays from C),
which is more verbose, but can deal efficiently with all kinds of
vectors (and arrays). For vectors, you can use the
scm_vector_elements
and scm_vector_writable_elements
functions as shortcuts.
Return non-zero if obj is a simple vector, else return zero. A simple vector is a vector that can be used with the
SCM_SIMPLE_*
macros below.The following functions are guaranteed to return simple vectors:
scm_make_vector
,scm_c_make_vector
,scm_vector
,scm_list_to_vector
.
Evaluates to the length of the simple vector vec. No type checking is done.
Evaluates to the element at position idx in the simple vector vec. No type or range checking is done.
Sets the element at position idx in the simple vector vec to val. No type or range checking is done.
Acquire a handle for the vector vec and return a pointer to the elements of it. This pointer can only be used to read the elements of vec. When vec is not a vector, an error is signaled. The handle mustr eventually be released with
scm_array_handle_release
.The variables pointed to by lenp and incp are filled with the number of elements of the vector and the increment (number of elements) between successive elements, respectively. Successive elements of vec need not be contiguous in their underlying “root vector” returned here; hence the increment is not necessarily equal to 1 and may well be negative too (see Shared Arrays).
The following example shows the typical way to use this function. It creates a list of all elements of vec (in reverse order).
scm_t_array_handle handle; size_t i, len; ssize_t inc; const SCM *elt; SCM list; elt = scm_vector_elements (vec, &handle, &len, &inc); list = SCM_EOL; for (i = 0; i < len; i++, elt += inc) list = scm_cons (*elt, list); scm_array_handle_release (&handle);
Like
scm_vector_elements
but the pointer can be used to modify the vector.The following example shows the typical way to use this function. It fills a vector with
#t
.scm_t_array_handle handle; size_t i, len; ssize_t inc; SCM *elt; elt = scm_vector_writable_elements (vec, &handle, &len, &inc); for (i = 0; i < len; i++, elt += inc) *elt = SCM_BOOL_T; scm_array_handle_release (&handle);