rewrite list<->vector converters in c
This commit is contained in:
parent
12fb80b857
commit
1e4bc04112
|
@ -6,24 +6,6 @@
|
||||||
|
|
||||||
;; assumes no derived expressions are provided yet
|
;; assumes no derived expressions are provided yet
|
||||||
|
|
||||||
(define (list->vector list)
|
|
||||||
(define vector (make-vector (length list)))
|
|
||||||
(define (go list i)
|
|
||||||
(if (null? list)
|
|
||||||
vector
|
|
||||||
(begin
|
|
||||||
(vector-set! vector i (car list))
|
|
||||||
(go (cdr list) (+ i 1)))))
|
|
||||||
(go list 0))
|
|
||||||
|
|
||||||
(define (vector->list vector)
|
|
||||||
(define (go i)
|
|
||||||
(if (= i (vector-length vector))
|
|
||||||
'()
|
|
||||||
(cons (vector-ref vector i)
|
|
||||||
(go (+ i 1)))))
|
|
||||||
(go 0))
|
|
||||||
|
|
||||||
(define (walk proc expr)
|
(define (walk proc expr)
|
||||||
"walk on symbols"
|
"walk on symbols"
|
||||||
(if (null? expr)
|
(if (null? expr)
|
||||||
|
|
|
@ -91,22 +91,6 @@
|
||||||
(r 'it)
|
(r 'it)
|
||||||
(cons (r 'or) (cdr exprs))))))))))
|
(cons (r 'or) (cdr exprs))))))))))
|
||||||
|
|
||||||
(define (list->vector list)
|
|
||||||
(let ((vector (make-vector (length list))))
|
|
||||||
(let loop ((list list) (i 0))
|
|
||||||
(if (null? list)
|
|
||||||
vector
|
|
||||||
(begin
|
|
||||||
(vector-set! vector i (car list))
|
|
||||||
(loop (cdr list) (+ i 1)))))))
|
|
||||||
|
|
||||||
(define (vector->list vector)
|
|
||||||
(let ((length (vector-length vector)))
|
|
||||||
(let loop ((list '()) (i 0))
|
|
||||||
(if (= i length)
|
|
||||||
(reverse list)
|
|
||||||
(loop (cons (vector-ref vector i) list) (+ i 1))))))
|
|
||||||
|
|
||||||
(define-syntax quasiquote
|
(define-syntax quasiquote
|
||||||
(ir-macro-transformer
|
(ir-macro-transformer
|
||||||
(lambda (form inject compare)
|
(lambda (form inject compare)
|
||||||
|
@ -714,27 +698,7 @@
|
||||||
;;; 6.8. Vector
|
;;; 6.8. Vector
|
||||||
|
|
||||||
(define (vector . objs)
|
(define (vector . objs)
|
||||||
(let ((len (length objs)))
|
(list->vector objs))
|
||||||
(let ((v (make-vector len)))
|
|
||||||
(do ((i 0 (+ i 1))
|
|
||||||
(l objs (cdr l)))
|
|
||||||
((= i len)
|
|
||||||
v)
|
|
||||||
(vector-set! v i (car l))))))
|
|
||||||
|
|
||||||
(define (vector->list vector . opts)
|
|
||||||
(let ((start (if (pair? opts) (car opts) 0))
|
|
||||||
(end (if (>= (length opts) 2)
|
|
||||||
(cadr opts)
|
|
||||||
(vector-length vector))))
|
|
||||||
(do ((i start (+ i 1))
|
|
||||||
(res '()))
|
|
||||||
((= i end)
|
|
||||||
(reverse res))
|
|
||||||
(set! res (cons (vector-ref vector i) res)))))
|
|
||||||
|
|
||||||
(define (list->vector list)
|
|
||||||
(apply vector list))
|
|
||||||
|
|
||||||
(define (vector-copy! to at from . opts)
|
(define (vector-copy! to at from . opts)
|
||||||
(let* ((start (if (pair? opts) (car opts) 0))
|
(let* ((start (if (pair? opts) (car opts) 0))
|
||||||
|
@ -785,8 +749,7 @@
|
||||||
(define (string->vector . args)
|
(define (string->vector . args)
|
||||||
(list->vector (apply string->list args)))
|
(list->vector (apply string->list args)))
|
||||||
|
|
||||||
(export vector vector->list list->vector
|
(export vector vector-copy! vector-copy
|
||||||
vector-copy! vector-copy
|
|
||||||
vector-append vector-fill!
|
vector-append vector-fill!
|
||||||
vector->string string->vector)
|
vector->string string->vector)
|
||||||
|
|
||||||
|
|
44
src/vector.c
44
src/vector.c
|
@ -119,6 +119,48 @@ pic_vec_vector_set(pic_state *pic)
|
||||||
return pic_none_value();
|
return pic_none_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
pic_vec_list_to_vector(pic_state *pic)
|
||||||
|
{
|
||||||
|
struct pic_vector *vec;
|
||||||
|
pic_value list, e, *data;
|
||||||
|
|
||||||
|
pic_get_args(pic, "o", &list);
|
||||||
|
|
||||||
|
vec = pic_vec_new(pic, pic_length(pic, list));
|
||||||
|
|
||||||
|
data = vec->data;
|
||||||
|
|
||||||
|
pic_for_each (e, list) {
|
||||||
|
*data++ = e;
|
||||||
|
}
|
||||||
|
return pic_obj_value(vec);
|
||||||
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
pic_vec_vector_to_list(pic_state *pic)
|
||||||
|
{
|
||||||
|
struct pic_vector *vec;
|
||||||
|
pic_value list;
|
||||||
|
int n, start, end, i;
|
||||||
|
|
||||||
|
n = pic_get_args(pic, "v|ii", &vec, &start, &end);
|
||||||
|
|
||||||
|
switch (n) {
|
||||||
|
case 1:
|
||||||
|
start = 0;
|
||||||
|
case 2:
|
||||||
|
end = vec->len;
|
||||||
|
}
|
||||||
|
|
||||||
|
list = pic_nil_value();
|
||||||
|
|
||||||
|
for (i = start; i < end; ++i) {
|
||||||
|
pic_push(pic, vec->data[i], list);
|
||||||
|
}
|
||||||
|
return pic_reverse(pic, list);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
pic_init_vector(pic_state *pic)
|
pic_init_vector(pic_state *pic)
|
||||||
{
|
{
|
||||||
|
@ -127,4 +169,6 @@ pic_init_vector(pic_state *pic)
|
||||||
pic_defun(pic, "vector-length", pic_vec_vector_length);
|
pic_defun(pic, "vector-length", pic_vec_vector_length);
|
||||||
pic_defun(pic, "vector-ref", pic_vec_vector_ref);
|
pic_defun(pic, "vector-ref", pic_vec_vector_ref);
|
||||||
pic_defun(pic, "vector-set!", pic_vec_vector_set);
|
pic_defun(pic, "vector-set!", pic_vec_vector_set);
|
||||||
|
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