diff --git a/lib/srfi/9.scm b/lib/srfi/9.scm index c1818042..9fb1aeca 100644 --- a/lib/srfi/9.scm +++ b/lib/srfi/9.scm @@ -17,7 +17,7 @@ (_type_slot_offset (rename 'type-slot-offset))) `(,(rename 'begin) ;; type - (,_define ,name (,_register ,name-str ,parent ',fields)) + (,_define ,name (,_register ,name-str ,parent ',(map car fields))) ;; predicate (,_define ,pred (,(rename 'make-type-predicate) ,(symbol->string (identifier->symbol pred)) @@ -25,42 +25,43 @@ ;; fields ,@(map (lambda (f) (and (pair? f) (pair? (cdr f)) - `(,_define ,(cadar ls) - (,(rename 'make-getter) - ,(symbol->string - (identifier->symbol (cadr f))) - ,name - (,_type_slot_offset ,name ,(car f)))))) + `(,_define ,(cadr f) + (,(rename 'make-getter) + ,(symbol->string + (identifier->symbol (cadr f))) + ,name + (,_type_slot_offset ,name ',(car f)))))) fields) ,@(map (lambda (f) (and (pair? f) (pair? (cdr f)) (pair? (cddr f)) - `(,_define ,(caddar ls) - (,(rename 'make-setter) - ,(symbol->string - (identifier->symbol (caddr f))) - ,name - (,_type_slot_offset ,name ,(car f)))))) + `(,_define ,(caddr f) + (,(rename 'make-setter) + ,(symbol->string + (identifier->symbol (caddr f))) + ,name + (,_type_slot_offset ,name ',(car f)))))) fields) ;; constructor (,_define ,make - ,(let lp ((ls make-fields) (sets '())) - (cond - ((null? ls) - `(,_let ((%make (,(rename 'make-constructor) - ,(symbol->string (identifier->symbol make)) - ,name))) - (,_lambda ,make-fields - (,_let ((res (%make))) - ,@sets - res)))) - (else - (let ((field (assq (car ls) fields))) - (cond - ((not field) - (error "unknown record field in constructor" (car ls))) - ((pair? (cddr field)) - (lp (cdr ls) - (cons (list (caddr field) 'res (car ls)) sets))) - (else - (lp (cdr ls) - (cons (list _slot-set! 'res (list 'quote (car ls)) (car ls)) sets)))))))))))))) + ,(let lp ((ls make-fields) (sets '())) + (cond + ((null? ls) + `(,_let ((%make (,(rename 'make-constructor) + ,(symbol->string (identifier->symbol make)) + ,name))) + (,_lambda ,make-fields + (,_let ((res (%make))) + ,@sets + res)))) + (else + (let ((field (assq (car ls) fields))) + (cond + ((not field) + (error "unknown record field in constructor" (car ls))) + ((pair? (cddr field)) + (lp (cdr ls) + (cons `(,(caddr field) res ,(car ls)) sets))) + (else + (lp (cdr ls) + (cons `(,_slot-set! ,name res (,_type_slot_offset ,name ',(car ls)) ,(car ls)) + sets))))))))))))))