+ao_poly
+ao_scheme_do_vector(struct ao_scheme_cons *cons)
+{
+ return ao_scheme_vector_poly(ao_scheme_list_to_vector(cons));
+}
+
+ao_poly
+ao_scheme_do_make_vector(struct ao_scheme_cons *cons)
+{
+ int32_t len;
+ ao_poly val;
+
+ if (!ao_scheme_parse_args(_ao_scheme_atom_make2dvector, cons,
+ AO_SCHEME_INT, &len,
+ AO_SCHEME_POLY|AO_SCHEME_ARG_OPTIONAL, _ao_scheme_bool_false, &val,
+ AO_SCHEME_ARG_END))
+ return AO_SCHEME_NIL;
+ return ao_scheme_vector_poly(ao_scheme_vector_alloc(len, val));
+}
+
+static bool
+ao_scheme_check_vector(ao_poly proc, struct ao_scheme_vector *vector, int32_t offset)
+{
+ if (offset < 0 || vector->length <= offset) {
+ (void) ao_scheme_error(AO_SCHEME_INVALID, "%v: vector index %d out of range (max %d)",
+ proc,
+ offset, vector->length);
+ return false;
+ }
+ return true;
+}
+
+ao_poly
+ao_scheme_do_vector_ref(struct ao_scheme_cons *cons)
+{
+ struct ao_scheme_vector *vector;
+ int32_t offset;
+
+ if (!ao_scheme_parse_args(_ao_scheme_atom_vector2dref, cons,
+ AO_SCHEME_VECTOR, &vector,
+ AO_SCHEME_INT, &offset,
+ AO_SCHEME_ARG_END))
+ return AO_SCHEME_NIL;
+ if (!ao_scheme_check_vector(_ao_scheme_atom_vector2dref, vector, offset))
+ return AO_SCHEME_NIL;
+ return vector->vals[offset];
+}
+
+ao_poly
+ao_scheme_do_vector_set(struct ao_scheme_cons *cons)
+{
+ struct ao_scheme_vector *vector;
+ int32_t offset;
+ ao_poly val;
+
+ if (!ao_scheme_parse_args(_ao_scheme_atom_vector2dset21, cons,
+ AO_SCHEME_VECTOR, &vector,
+ AO_SCHEME_INT, &offset,
+ AO_SCHEME_POLY, &val,
+ AO_SCHEME_ARG_END))
+ return AO_SCHEME_NIL;
+ if (!ao_scheme_check_vector(_ao_scheme_atom_vector2dset21, vector, offset))
+ return AO_SCHEME_NIL;
+ vector->vals[offset] = val;
+ return val;
+}
+
+ao_poly
+ao_scheme_do_list_to_vector(struct ao_scheme_cons *cons)
+{
+ struct ao_scheme_cons *pair;
+
+ if (!ao_scheme_parse_args(_ao_scheme_atom_list2d3evector, cons,
+ AO_SCHEME_CONS|AO_SCHEME_ARG_NIL_OK, &pair,
+ AO_SCHEME_ARG_END))
+ return AO_SCHEME_NIL;
+ return ao_scheme_vector_poly(ao_scheme_list_to_vector(pair));
+}
+
+ao_poly
+ao_scheme_do_vector_to_list(struct ao_scheme_cons *cons)
+{
+ struct ao_scheme_vector *vector;
+ int32_t start, end;
+
+ if (!ao_scheme_parse_args(_ao_scheme_atom_vector2d3elist, cons,
+ AO_SCHEME_VECTOR, &vector,
+ AO_SCHEME_INT|AO_SCHEME_ARG_OPTIONAL, ao_scheme_int_poly(0), &start,
+ AO_SCHEME_INT|AO_SCHEME_ARG_OPTIONAL, ao_scheme_int_poly(-1), &end,
+ AO_SCHEME_ARG_END))
+ return AO_SCHEME_NIL;
+ if (end == -1)
+ end = vector->length;
+ return ao_scheme_cons_poly(ao_scheme_vector_to_list(vector, start, end));
+}
+
+ao_poly
+ao_scheme_do_vector_length(struct ao_scheme_cons *cons)
+{
+ struct ao_scheme_vector *vector;
+
+ if (!ao_scheme_parse_args(_ao_scheme_atom_vector2d3elist, cons,
+ AO_SCHEME_VECTOR, &vector,
+ AO_SCHEME_ARG_END))
+ return AO_SCHEME_NIL;
+ return ao_scheme_integer_poly(vector->length);
+}
+
+ao_poly
+ao_scheme_do_vectorp(struct ao_scheme_cons *cons)
+{
+ return ao_scheme_do_typep(_ao_scheme_atom_vector3f, AO_SCHEME_VECTOR, cons);
+}
+