Node:Vector Creation, Next:, Previous:Vector Syntax, Up:Vectors

22.3.2 Dynamic Vector Creation and Validation

Instead of creating a vector implicitly by using the read syntax just described, you can create a vector dynamically by calling one of the vector and list->vector primitives with the list of Scheme values that you want to place into a vector. The size of the vector thus created is determined implicitly by the number of arguments given.

vector . l Scheme Procedure
list->vector l Scheme Procedure
scm_vector (l) C Function
Return a newly allocated vector composed of the given arguments. Analogous to list.
(vector 'a 'b 'c) => #(a b c)

(As an aside, an interesting implementation detail is that the Guile reader reads the #(...) syntax by reading everything but the initial # as a list, and then passing the list that results to list->vector. Notice how neatly this fits with the similarity between the read (and print) syntaxes for lists and vectors.)

The inverse operation is vector->list:

vector->list v Scheme Procedure
scm_vector_to_list (v) C Function
Return a newly allocated list composed of the elements of v.
(vector->list '#(dah dah didah)) =>  (dah dah didah)
(list->vector '(dididit dah)) =>  #(dididit dah)

To allocate a vector with an explicitly specified size, use make-vector. With this primitive you can also specify an initial value for the vector elements (the same value for all elements, that is):

make-vector k [fill] Scheme Procedure
scm_make_vector (k, fill) C Function
Return a newly allocated vector of k elements. If a second argument is given, then each position is initialized to fill. Otherwise the initial contents of each position is unspecified.

To check whether an arbitrary Scheme value is a vector, use the vector? primitive:

vector? obj Scheme Procedure
scm_vector_p (obj) C Function
Return #t if obj is a vector, otherwise return #f.