define 'define-record-type' macro in scheme/base.scm
This commit is contained in:
		
							parent
							
								
									5f454626f6
								
							
						
					
					
						commit
						3bcc4b15fc
					
				
							
								
								
									
										1
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										1
									
								
								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\
 | ||||
|  |  | |||
|  | @ -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 <meta-type>) name) | ||||
|     (let ((rectype (make-record <meta-type>))) | ||||
|       (record-set! rectype 'name name) | ||||
|       rectype)) | ||||
| 
 | ||||
|   (define <record-type> | ||||
|     (let ((<record-type> ((boot-make-record-type #t) 'record-type))) | ||||
|       (record-set! <record-type> '@@type <record-type>) | ||||
|       <record-type>)) | ||||
| 
 | ||||
|   (define make-record-type (boot-make-record-type <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 | ||||
|  |  | |||
|  | @ -1,6 +1,5 @@ | |||
| (define-library (picrin array) | ||||
|   (import (picrin base) | ||||
|           (picrin record)) | ||||
|   (import (scheme base)) | ||||
| 
 | ||||
|   (define-record-type <array> | ||||
|     (create-array data size head tail) | ||||
|  |  | |||
|  | @ -1,59 +0,0 @@ | |||
| (define-library (picrin record) | ||||
|   (import (picrin base) | ||||
|           (picrin macro)) | ||||
| 
 | ||||
|   ;; record meta type | ||||
| 
 | ||||
|   (define ((boot-make-record-type <meta-type>) name) | ||||
|     (let ((rectype (make-record <meta-type>))) | ||||
|       (record-set! rectype 'name name) | ||||
|       rectype)) | ||||
| 
 | ||||
|   (define <record-type> | ||||
|     (let ((<record-type> ((boot-make-record-type #t) 'record-type))) | ||||
|       (record-set! <record-type> '@@type <record-type>) | ||||
|       <record-type>)) | ||||
| 
 | ||||
|   (define make-record-type (boot-make-record-type <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)) | ||||
		Loading…
	
		Reference in New Issue
	
	 Yuichi Nishiwaki
						Yuichi Nishiwaki