mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-19 21:59:16 +02:00
Added (vector-set!)
This commit is contained in:
parent
0798ded8a3
commit
0e8cd6a94e
5 changed files with 28 additions and 4 deletions
3
cgen.scm
3
cgen.scm
|
@ -436,7 +436,9 @@
|
||||||
((eq? p 'string->list) "string2list")
|
((eq? p 'string->list) "string2list")
|
||||||
((eq? p 'make-vector) "make_vector")
|
((eq? p 'make-vector) "make_vector")
|
||||||
((eq? p 'list->vector) "list2vector")
|
((eq? p 'list->vector) "list2vector")
|
||||||
|
((eq? p 'vector-length) "Cyc_vector_length")
|
||||||
((eq? p 'vector-ref) "Cyc_vector_ref")
|
((eq? p 'vector-ref) "Cyc_vector_ref")
|
||||||
|
((eq? p 'vector-set!) "Cyc_vector_set")
|
||||||
((eq? p 'string-append) "Cyc_string_append")
|
((eq? p 'string-append) "Cyc_string_append")
|
||||||
((eq? p 'string-cmp) "Cyc_string_cmp")
|
((eq? p 'string-cmp) "Cyc_string_cmp")
|
||||||
((eq? p 'string->symbol) "Cyc_string2symbol")
|
((eq? p 'string->symbol) "Cyc_string2symbol")
|
||||||
|
@ -450,7 +452,6 @@
|
||||||
((eq? p 'memv) "memqp")
|
((eq? p 'memv) "memqp")
|
||||||
((eq? p 'member) "memberp")
|
((eq? p 'member) "memberp")
|
||||||
((eq? p 'length) "Cyc_length")
|
((eq? p 'length) "Cyc_length")
|
||||||
((eq? p 'vector-length) "Cyc_vector_length")
|
|
||||||
((eq? p 'set-car!) "Cyc_set_car")
|
((eq? p 'set-car!) "Cyc_set_car")
|
||||||
((eq? p 'set-cdr!) "Cyc_set_cdr")
|
((eq? p 'set-cdr!) "Cyc_set_cdr")
|
||||||
((eq? p 'eq?) "Cyc_eq")
|
((eq? p 'eq?) "Cyc_eq")
|
||||||
|
|
3
eval.scm
3
eval.scm
|
@ -223,7 +223,6 @@
|
||||||
(list 'memv memv)
|
(list 'memv memv)
|
||||||
(list 'member member)
|
(list 'member member)
|
||||||
(list 'length length)
|
(list 'length length)
|
||||||
(list 'vector-length vector-length)
|
|
||||||
(list 'set-car! set-car!)
|
(list 'set-car! set-car!)
|
||||||
(list 'set-cdr! set-cdr!)
|
(list 'set-cdr! set-cdr!)
|
||||||
(list 'car car)
|
(list 'car car)
|
||||||
|
@ -268,7 +267,9 @@
|
||||||
(list 'number->string number->string)
|
(list 'number->string number->string)
|
||||||
(list 'make-vector make-vector)
|
(list 'make-vector make-vector)
|
||||||
(list 'list->vector list->vector)
|
(list 'list->vector list->vector)
|
||||||
|
(list 'vector-length vector-length)
|
||||||
(list 'vector-ref vector-ref)
|
(list 'vector-ref vector-ref)
|
||||||
|
(list 'vector-set! vector-set!)
|
||||||
(list 'boolean? boolean?)
|
(list 'boolean? boolean?)
|
||||||
(list 'char? char?)
|
(list 'char? char?)
|
||||||
(list 'eof-object? eof-object?)
|
(list 'eof-object? eof-object?)
|
||||||
|
|
22
runtime.c
22
runtime.c
|
@ -577,6 +577,16 @@ object Cyc_set_cdr(object l, object val) {
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object Cyc_vector_set(object v, object k, object obj) {
|
||||||
|
// TODO: bounds checking? do eventually need to figure out where that should go
|
||||||
|
int idx = ((integer_type *)k)->value;
|
||||||
|
((vector)v)->elts[idx] = obj;
|
||||||
|
// TODO: probably could be more efficient here and also pass
|
||||||
|
// index, so only that one entry needs GC.
|
||||||
|
add_mutation(v, obj);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
object Cyc_vector_ref(object v, object k) {
|
object Cyc_vector_ref(object v, object k) {
|
||||||
if (nullp(v) || is_value_type(v) || ((list)v)->tag != vector_tag) {
|
if (nullp(v) || is_value_type(v) || ((list)v)->tag != vector_tag) {
|
||||||
Cyc_rt_raise_msg("vector-ref - invalid parameter, expected vector\n");
|
Cyc_rt_raise_msg("vector-ref - invalid parameter, expected vector\n");
|
||||||
|
@ -1138,6 +1148,9 @@ void _make_91vector(object cont, object args) {
|
||||||
void _vector_91ref(object cont, object args) {
|
void _vector_91ref(object cont, object args) {
|
||||||
object ref = Cyc_vector_ref(car(args), cadr(args));
|
object ref = Cyc_vector_ref(car(args), cadr(args));
|
||||||
return_funcall1(cont, ref);}
|
return_funcall1(cont, ref);}
|
||||||
|
void _vector_91set_67(object cont, object args) {
|
||||||
|
object ref = Cyc_vector_set(car(args), cadr(args), caddr(args));
|
||||||
|
return_funcall1(cont, ref);}
|
||||||
void _list_91_125vector(object cont, object args) {
|
void _list_91_125vector(object cont, object args) {
|
||||||
list2vector(l, car(args));
|
list2vector(l, car(args));
|
||||||
return_funcall1(cont, l);}
|
return_funcall1(cont, l);}
|
||||||
|
@ -1478,7 +1491,12 @@ void GC_loop(int major, closure cont, object *ans, int num_ans)
|
||||||
// GC's of list/car-cdr from same generation
|
// GC's of list/car-cdr from same generation
|
||||||
transp(car(o));
|
transp(car(o));
|
||||||
transp(cdr(o));
|
transp(cdr(o));
|
||||||
// TODO: } else if (type_of(o) == vector_tag) {
|
} else if (type_of(o) == vector_tag) {
|
||||||
|
int i;
|
||||||
|
// TODO: probably too inefficient, try collecting single index
|
||||||
|
for (i = 0; i < ((vector)o)->num_elt; i++) {
|
||||||
|
transp(((vector)o)->elts[i]);
|
||||||
|
}
|
||||||
} else if (type_of(o) == forward_tag) {
|
} else if (type_of(o) == forward_tag) {
|
||||||
// Already transported, skip
|
// Already transported, skip
|
||||||
} else {
|
} else {
|
||||||
|
@ -1830,6 +1848,7 @@ static primitive_type number_91_125string_primitive = {primitive_tag, "number->s
|
||||||
static primitive_type list_91_125vector_primitive = {primitive_tag, "list-vector", &_list_91_125vector};
|
static primitive_type list_91_125vector_primitive = {primitive_tag, "list-vector", &_list_91_125vector};
|
||||||
static primitive_type make_91vector_primitive = {primitive_tag, "make-vector", &_make_91vector};
|
static primitive_type make_91vector_primitive = {primitive_tag, "make-vector", &_make_91vector};
|
||||||
static primitive_type vector_91ref_primitive = {primitive_tag, "vector-ref", &_vector_91ref};
|
static primitive_type vector_91ref_primitive = {primitive_tag, "vector-ref", &_vector_91ref};
|
||||||
|
static primitive_type vector_91set_67_primitive = {primitive_tag, "vector-set!", &_vector_91set_67};
|
||||||
static primitive_type boolean_127_primitive = {primitive_tag, "boolean?", &_boolean_127};
|
static primitive_type boolean_127_primitive = {primitive_tag, "boolean?", &_boolean_127};
|
||||||
static primitive_type char_127_primitive = {primitive_tag, "char?", &_char_127};
|
static primitive_type char_127_primitive = {primitive_tag, "char?", &_char_127};
|
||||||
static primitive_type eof_91object_127_primitive = {primitive_tag, "eof-object?", &_eof_91object_127};
|
static primitive_type eof_91object_127_primitive = {primitive_tag, "eof-object?", &_eof_91object_127};
|
||||||
|
@ -1887,6 +1906,7 @@ const object primitive_memv = &memv_primitive;
|
||||||
const object primitive_length = &length_primitive;
|
const object primitive_length = &length_primitive;
|
||||||
const object primitive_vector_91length = &vector_91length_primitive;
|
const object primitive_vector_91length = &vector_91length_primitive;
|
||||||
const object primitive_vector_91ref = &vector_91ref_primitive;
|
const object primitive_vector_91ref = &vector_91ref_primitive;
|
||||||
|
const object primitive_vector_91set_67 = &vector_91set_67_primitive;
|
||||||
const object primitive_set_91car_67 = &set_91car_67_primitive;
|
const object primitive_set_91car_67 = &set_91car_67_primitive;
|
||||||
const object primitive_set_91cdr_67 = &set_91cdr_67_primitive;
|
const object primitive_set_91cdr_67 = &set_91cdr_67_primitive;
|
||||||
const object primitive_car = &car_primitive;
|
const object primitive_car = &car_primitive;
|
||||||
|
|
|
@ -297,6 +297,7 @@ extern const object primitive_number_91_125string;
|
||||||
extern const object primitive_make_91vector;
|
extern const object primitive_make_91vector;
|
||||||
extern const object primitive_list_91_125vector;
|
extern const object primitive_list_91_125vector;
|
||||||
extern const object primitive_vector_91ref;
|
extern const object primitive_vector_91ref;
|
||||||
|
extern const object primitive_vector_91set_67;
|
||||||
extern const object primitive_system;
|
extern const object primitive_system;
|
||||||
extern const object primitive_boolean_127;
|
extern const object primitive_boolean_127;
|
||||||
extern const object primitive_char_127;
|
extern const object primitive_char_127;
|
||||||
|
|
|
@ -498,7 +498,6 @@
|
||||||
memv
|
memv
|
||||||
member
|
member
|
||||||
length
|
length
|
||||||
vector-length
|
|
||||||
set-car!
|
set-car!
|
||||||
set-cdr!
|
set-cdr!
|
||||||
car
|
car
|
||||||
|
@ -519,7 +518,9 @@
|
||||||
number->string
|
number->string
|
||||||
make-vector
|
make-vector
|
||||||
list->vector
|
list->vector
|
||||||
|
vector-length
|
||||||
vector-ref
|
vector-ref
|
||||||
|
vector-set!
|
||||||
boolean?
|
boolean?
|
||||||
char?
|
char?
|
||||||
eof-object?
|
eof-object?
|
||||||
|
|
Loading…
Add table
Reference in a new issue