33 lines
1.0 KiB
Scheme
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)))
|
|
)))
|
|
...))))))
|