diff options
| -rw-r--r-- | lib/scheme/base/50-records.csc | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/lib/scheme/base/50-records.csc b/lib/scheme/base/50-records.csc index d7fa8d1..2830b3c 100644 --- a/lib/scheme/base/50-records.csc +++ b/lib/scheme/base/50-records.csc @@ -29,17 +29,23 @@ (define-syntax define-selectors (syntax-rules () - ((define-selectors (selectors ...)) + ((define-selectors pred (selectors ...)) (values selectors ...)) - ((define-selectors (selectors ...) (field getter) selector ...) - (define-selectors (selectors ... (lambda (r) - (call-builtin peek r field))) + ((define-selectors pred (selectors ...) (field getter) selector ...) + (define-selectors pred (selectors ... (lambda (r) + (unless (pred r) + (error "unexpected type in getter" r 'getter)) + (call-builtin peek r field))) selector ...)) - ((define-selectors (selectors ...) (field getter setter) selector ...) - (define-selectors (selectors ... (lambda (r) - (call-builtin peek r field)) - (lambda (r val) - (call-builtin poke val r field))) + ((define-selectors pred (selectors ...) (field getter setter) selector ...) + (define-selectors pred (selectors ... (lambda (r) + (unless (pred r) + (error "unexpected type in getter" r 'getter)) + (call-builtin peek r field)) + (lambda (r val) + (unless (pred r) + (error "unexpected type in setter" r 'setter)) + (call-builtin poke val r field))) selector ...)))) |
