mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-04 05:50:26 +02:00
(%record-type-check): New function.
(record-accessor, record-modifier): Use it for a strict type check of the given record. Previously an accessor returned #f on a wrong record type, and modifier silently did nothing.
This commit is contained in:
parent
729ab63afa
commit
b0c50494b6
1 changed files with 11 additions and 4 deletions
|
@ -429,13 +429,20 @@
|
|||
(define (record-predicate rtd)
|
||||
(lambda (obj) (and (struct? obj) (eq? rtd (struct-vtable obj)))))
|
||||
|
||||
(define (%record-type-check rtd obj) ;; private helper
|
||||
(or (eq? rtd (record-type-descriptor obj))
|
||||
(scm-error 'wrong-type-arg "%record-type-check"
|
||||
"Wrong type record (want `~S'): ~S"
|
||||
(list (record-type-name rtd) obj)
|
||||
#f)))
|
||||
|
||||
(define (record-accessor rtd field-name)
|
||||
(let* ((pos (list-index (record-type-fields rtd) field-name)))
|
||||
(if (not pos)
|
||||
(error 'no-such-field field-name))
|
||||
(local-eval `(lambda (obj)
|
||||
(and (eq? ',rtd (record-type-descriptor obj))
|
||||
(struct-ref obj ,pos)))
|
||||
(%record-type-check ',rtd obj)
|
||||
(struct-ref obj ,pos))
|
||||
the-root-environment)))
|
||||
|
||||
(define (record-modifier rtd field-name)
|
||||
|
@ -443,8 +450,8 @@
|
|||
(if (not pos)
|
||||
(error 'no-such-field field-name))
|
||||
(local-eval `(lambda (obj val)
|
||||
(and (eq? ',rtd (record-type-descriptor obj))
|
||||
(struct-set! obj ,pos val)))
|
||||
(%record-type-check ',rtd obj)
|
||||
(struct-set! obj ,pos val))
|
||||
the-root-environment)))
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue