rewrite vector-append in c
This commit is contained in:
parent
5244b2f45d
commit
4676550961
|
@ -639,23 +639,13 @@
|
|||
(define (vector . objs)
|
||||
(list->vector objs))
|
||||
|
||||
(define (vector-append . vs)
|
||||
(define (vector-append-2-inv w v)
|
||||
(let ((res (make-vector (+ (vector-length v) (vector-length w)))))
|
||||
(vector-copy! res 0 v)
|
||||
(vector-copy! res (vector-length v) w)
|
||||
res))
|
||||
(fold vector-append-2-inv #() vs))
|
||||
|
||||
(define (vector->string . args)
|
||||
(list->string (apply vector->list args)))
|
||||
|
||||
(define (string->vector . args)
|
||||
(list->vector (apply string->list args)))
|
||||
|
||||
(export vector vector-copy! vector-copy
|
||||
vector-append vector-fill!
|
||||
vector->string string->vector)
|
||||
(export vector vector->string string->vector)
|
||||
|
||||
;;; 6.9 bytevector
|
||||
|
||||
|
|
29
src/vector.c
29
src/vector.c
|
@ -173,6 +173,34 @@ pic_vec_vector_copy(pic_state *pic)
|
|||
return pic_obj_value(to);
|
||||
}
|
||||
|
||||
static pic_value
|
||||
pic_vec_vector_append(pic_state *pic)
|
||||
{
|
||||
size_t argc, i, j, len;
|
||||
pic_value *argv;
|
||||
pic_vec *vec;
|
||||
|
||||
pic_get_args(pic, "*", &argc, &argv);
|
||||
|
||||
len = 0;
|
||||
for (i = 0; i < argc; ++i) {
|
||||
pic_assert_type(pic, argv[i], vec);
|
||||
len += pic_vec_ptr(argv[i])->len;
|
||||
}
|
||||
|
||||
vec = pic_vec_new(pic, len);
|
||||
|
||||
len = 0;
|
||||
for (i = 0; i < argc; ++i) {
|
||||
for (j = 0; j < pic_vec_ptr(argv[i])->len; ++j) {
|
||||
vec->data[len + j] = pic_vec_ptr(argv[i])->data[j];
|
||||
}
|
||||
len += pic_vec_ptr(argv[i])->len;
|
||||
}
|
||||
|
||||
return pic_obj_value(vec);
|
||||
}
|
||||
|
||||
static pic_value
|
||||
pic_vec_vector_fill_i(pic_state *pic)
|
||||
{
|
||||
|
@ -248,6 +276,7 @@ pic_init_vector(pic_state *pic)
|
|||
pic_defun(pic, "vector-set!", pic_vec_vector_set);
|
||||
pic_defun(pic, "vector-copy!", pic_vec_vector_copy_i);
|
||||
pic_defun(pic, "vector-copy", pic_vec_vector_copy);
|
||||
pic_defun(pic, "vector-append", pic_vec_vector_append);
|
||||
pic_defun(pic, "vector-fill!", pic_vec_vector_fill_i);
|
||||
pic_defun(pic, "list->vector", pic_vec_list_to_vector);
|
||||
pic_defun(pic, "vector->list", pic_vec_vector_to_list);
|
||||
|
|
Loading…
Reference in New Issue