diff --git a/contrib/20.r7rs/scheme/base.scm b/contrib/20.r7rs/scheme/base.scm index 12bc14cd..736e489d 100644 --- a/contrib/20.r7rs/scheme/base.scm +++ b/contrib/20.r7rs/scheme/base.scm @@ -412,18 +412,6 @@ ;; 5.5 Recored-type definitions - (define ((boot-make-record-type ) name) - (let ((rectype (make-record ))) - (record-set! rectype 'name name) - rectype)) - - (define - (let (( ((boot-make-record-type #t) 'record-type))) - (record-set! '@@type ) - )) - - (define make-record-type (boot-make-record-type )) - (define-syntax (define-record-constructor type name . fields) (let ((record #'record)) #`(define (#,name . #,fields) @@ -457,7 +445,7 @@ (define-syntax (define-record-type name ctor pred . fields) #`(begin - (define #,name (make-record-type '#,name)) + (define #,name (make-record )) (define-record-constructor #,name #,@ctor) (define-record-predicate #,name #,pred) #,@(map (lambda (field) #`(define-record-field #,pred #,@field)) fields))) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index c2345ace..18b853f0 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -389,6 +389,7 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) break; } case PIC_TT_RECORD: { + gc_mark_object(pic, (struct pic_object *)obj->u.rec.type); LOOP(obj->u.rec.data); break; } diff --git a/extlib/benz/include/picrin/record.h b/extlib/benz/include/picrin/record.h index e3edcd01..befc6407 100644 --- a/extlib/benz/include/picrin/record.h +++ b/extlib/benz/include/picrin/record.h @@ -11,15 +11,16 @@ extern "C" { struct pic_record { PIC_OBJECT_HEADER + struct pic_record *type; struct pic_dict *data; }; #define pic_record_p(v) (pic_type(v) == PIC_TT_RECORD) #define pic_record_ptr(v) ((struct pic_record *)pic_ptr(v)) -struct pic_record *pic_make_record(pic_state *, pic_value); +struct pic_record *pic_make_record(pic_state *, struct pic_record *); -pic_value pic_record_type(pic_state *, struct pic_record *); +struct pic_record *pic_record_type(pic_state *, struct pic_record *); pic_value pic_record_ref(pic_state *, struct pic_record *, pic_sym *); void pic_record_set(pic_state *, struct pic_record *, pic_sym *, pic_value); diff --git a/extlib/benz/record.c b/extlib/benz/record.c index db14159e..6f733a9f 100644 --- a/extlib/benz/record.c +++ b/extlib/benz/record.c @@ -5,25 +5,26 @@ #include "picrin.h" struct pic_record * -pic_make_record(pic_state *pic, pic_value rectype) +pic_make_record(pic_state *pic, struct pic_record *type) { struct pic_record *rec; - struct pic_dict *data; - - data = pic_make_dict(pic); + struct pic_dict *data = pic_make_dict(pic); rec = (struct pic_record *)pic_obj_alloc(pic, sizeof(struct pic_record), PIC_TT_RECORD); rec->data = data; + rec->type = type; - pic_record_set(pic, rec, pic_intern(pic, "@@type"), rectype); + if (rec->type == NULL) { + rec->type = rec; + } return rec; } -pic_value -pic_record_type(pic_state *pic, struct pic_record *rec) +struct pic_record * +pic_record_type(pic_state PIC_UNUSED(*pic), struct pic_record *rec) { - return pic_record_ref(pic, rec, pic_intern(pic, "@@type")); + return rec->type; } pic_value @@ -49,7 +50,9 @@ pic_record_make_record(pic_state *pic) pic_get_args(pic, "o", &rectype); - rec = pic_make_record(pic, rectype); + pic_assert_type(pic, rectype, record); + + rec = pic_make_record(pic, pic_record_ptr(rectype)); return pic_obj_value(rec); } @@ -71,7 +74,7 @@ pic_record_record_type(pic_state *pic) pic_get_args(pic, "r", &rec); - return pic_record_type(pic, rec); + return pic_obj_value(pic_record_type(pic, rec)); } static pic_value @@ -107,4 +110,5 @@ pic_init_record(pic_state *pic) pic_defun(pic, "record-type", pic_record_record_type); pic_defun(pic, "record-ref", pic_record_record_ref); pic_defun(pic, "record-set!", pic_record_record_set); + pic_define(pic, "", pic_obj_value(pic_make_record(pic, NULL))); }