scheme-libraries/retropikzel/record.scm

33 lines
1.0 KiB
Scheme

(define-syntax record
(syntax-rules ()
((_ (field value) ...)
(let ((field value) ...)
(lambda (name . val)
(cond ((equal? 'field name)
(if (null? val)
field
(set! field (car val)))) ...))))))
(define-syntax immutable-record
(syntax-rules ()
((_ (field value) ...)
(lambda (name)
(cond ((equal? 'field name) value) ...)))))
(define-syntax typed-record
(syntax-rules ()
((_ (field value type-check) ...)
(let ((field value) ...)
(lambda (name . val)
(cond ((equal? 'field name)
(if (null? val)
field
(if (type-check (car val))
(set! field (car val))
(error (string-append "type-check fail "
(symbol->string name))
`((,name ,(car val))
(type-check ,type-check)))
)))
...))))))