diff options
author | Andy Wingo <wingo@pobox.com> | 2019-10-28 16:58:22 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2019-10-28 16:59:58 +0100 |
commit | 315fabdfe7122737ca9a804097ff16dabfd7a63a (patch) | |
tree | bedc0edf9abe43bad1d3bd6535c710019be7dca8 /test-suite/tests/records.test | |
parent | f963bdf02d7dd316884ccc9d590b3a7327406422 (diff) | |
download | guile-315fabdfe7122737ca9a804097ff16dabfd7a63a.tar.gz |
Add support for immutable fields in core records
* module/ice-9/boot-9.scm (make-record-type): Allow (mutable NAME)
or (immutable NAME) as a field name, and record field mutability in a
bitfield.
(record-modifier): Throw an error if the field isn't mutable.
* test-suite/tests/records.test ("records"): Add tests.
* doc/ref/api-data.texi (Records): Update.
Diffstat (limited to 'test-suite/tests/records.test')
-rw-r--r-- | test-suite/tests/records.test | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/test-suite/tests/records.test b/test-suite/tests/records.test index 5ec784c49..375733419 100644 --- a/test-suite/tests/records.test +++ b/test-suite/tests/records.test @@ -166,4 +166,34 @@ (pass-if (not (record-type-opaque? b))) (pass-if (record-type-opaque? c)) (pass-if-exception "non-opaque" '(misc-error . "opaque") - (make-record-type 'd '() #:opaque? #f #:parent a))))) + (make-record-type 'd '() #:opaque? #f #:parent a)))) + + (with-test-prefix "immutable fields" + (let () + (define a (make-record-type 'a '(s t (mutable u) (immutable v)) + #:extensible? #t)) + (define b (make-record-type 'b '(w (immutable x)) #:parent a)) + + (pass-if-exception "bad field" '(misc-error . "field") + (make-record-type 'a '("foo"))) + (pass-if-exception "bad field" '(misc-error . "field") + (make-record-type 'a '((mutable u x)))) + (pass-if-exception "bad field" '(misc-error . "field") + (make-record-type 'a '((qux u)))) + (pass-if-equal (record-type-mutable-fields a) #b0111) + (pass-if-equal (record-type-mutable-fields b) #b010111) + + (pass-if (procedure? (record-modifier a 's))) + (pass-if (procedure? (record-modifier a 't))) + (pass-if (procedure? (record-modifier a 'u))) + (pass-if-exception "immutable" '(misc-error . "immutable") + (record-modifier a 'v)) + + (pass-if (procedure? (record-modifier b 's))) + (pass-if (procedure? (record-modifier b 't))) + (pass-if (procedure? (record-modifier b 'u))) + (pass-if-exception "immutable" '(misc-error . "immutable") + (record-modifier b 'v)) + (pass-if (procedure? (record-modifier b 'w))) + (pass-if-exception "immutable" '(misc-error . "immutable") + (record-modifier b 'x))))) |