diff --git a/Makefile b/Makefile index 915b90cf..00170c29 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,6 @@ PICRIN_OBJS = \ PICRIN_LIBS = \ piclib/picrin/base.scm\ piclib/picrin/macro.scm\ - piclib/picrin/record.scm\ piclib/picrin/control.scm\ piclib/picrin/experimental/lambda.scm\ piclib/picrin/syntax-rules.scm\ diff --git a/contrib/20.r7rs/scheme/base.scm b/contrib/20.r7rs/scheme/base.scm index 927643aa..2e27f201 100644 --- a/contrib/20.r7rs/scheme/base.scm +++ b/contrib/20.r7rs/scheme/base.scm @@ -1,7 +1,6 @@ (define-library (scheme base) (import (picrin base) (picrin macro) - (picrin record) (picrin syntax-rules) (picrin string) (scheme file)) @@ -171,6 +170,56 @@ ;; 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) + (let ((#,record (make-record #,type))) + #,@(map (lambda (field) #`(record-set! #,record '#,field #,field)) fields) + #,record)))) + + (define-syntax (define-record-predicate type name) + #`(define (#,name obj) + (and (record? obj) + (eq? (record-type obj) #,type)))) + + (define-syntax (define-record-accessor pred field accessor) + #`(define (#,accessor record) + (if (#,pred record) + (record-ref record '#,field) + (error (string-append (symbol->string '#,accessor) ": wrong record type") record)))) + + (define-syntax (define-record-modifier pred field modifier) + #`(define (#,modifier record val) + (if (#,pred record) + (record-set! record '#,field val) + (error (string-append (symbol->string '#,modifier) ": wrong record type") record)))) + + (define-syntax (define-record-field pred field accessor . modifier-opt) + (if (null? modifier-opt) + #`(define-record-accessor #,pred #,field #,accessor) + #`(begin + (define-record-accessor #,pred #,field #,accessor) + (define-record-modifier #,pred #,field #,(car modifier-opt))))) + + (define-syntax (define-record-type name ctor pred . fields) + #`(begin + (define #,name (make-record-type '#,name)) + (define-record-constructor #,name #,@ctor) + (define-record-predicate #,name #,pred) + #,@(map (lambda (field) #`(define-record-field #,pred #,@field)) fields))) + (export define-record-type) ;; 6.1. Equivalence predicates diff --git a/contrib/90.array/array.scm b/contrib/90.array/array.scm index 6412d136..43abd388 100644 --- a/contrib/90.array/array.scm +++ b/contrib/90.array/array.scm @@ -1,6 +1,5 @@ (define-library (picrin array) - (import (picrin base) - (picrin record)) + (import (scheme base)) (define-record-type (create-array data size head tail) diff --git a/piclib/picrin/record.scm b/piclib/picrin/record.scm deleted file mode 100644 index 20d75f77..00000000 --- a/piclib/picrin/record.scm +++ /dev/null @@ -1,59 +0,0 @@ -(define-library (picrin record) - (import (picrin base) - (picrin macro)) - - ;; record meta type - - (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-record-type - - (define-syntax (define-record-constructor type name . fields) - (let ((record #'record)) - #`(define (#,name . #,fields) - (let ((#,record (make-record #,type))) - #,@(map (lambda (field) #`(record-set! #,record '#,field #,field)) fields) - #,record)))) - - (define-syntax (define-record-predicate type name) - #`(define (#,name obj) - (and (record? obj) - (eq? (record-type obj) #,type)))) - - (define-syntax (define-record-accessor pred field accessor) - #`(define (#,accessor record) - (if (#,pred record) - (record-ref record '#,field) - (error (string-append (symbol->string '#,accessor) ": wrong record type") record)))) - - (define-syntax (define-record-modifier pred field modifier) - #`(define (#,modifier record val) - (if (#,pred record) - (record-set! record '#,field val) - (error (string-append (symbol->string '#,modifier) ": wrong record type") record)))) - - (define-syntax (define-record-field pred field accessor . modifier-opt) - (if (null? modifier-opt) - #`(define-record-accessor #,pred #,field #,accessor) - #`(begin - (define-record-accessor #,pred #,field #,accessor) - (define-record-modifier #,pred #,field #,(car modifier-opt))))) - - (define-syntax (define-record-type name ctor pred . fields) - #`(begin - (define #,name (make-record-type '#,name)) - (define-record-constructor #,name #,@ctor) - (define-record-predicate #,name #,pred) - #,@(map (lambda (field) #`(define-record-field #,pred #,@field)) fields))) - - (export define-record-type))