diff options
| author | Ludovic Courtès <ludo@gnu.org> | 2026-03-06 18:46:35 +0100 |
|---|---|---|
| committer | Ludovic Courtès <ludo@gnu.org> | 2026-03-20 13:27:15 +0100 |
| commit | a7c8e68dc51144a6d3981b770aca9c4897fc7c0c (patch) | |
| tree | 9e1f59985c9d536e71a71860cdf892c2a497d17c /tests | |
| parent | e1457c467953b871d14214f6d617fdfea8ab15c1 (diff) | |
records: Let thunked fields refer to their inherited value.
* guix/records.scm (make-syntactic-constructor)[field-index]: New procedure.
[wrap-field-value]: Add optional argument ‘parent’. When it is true, bind F
to the inherited field value.
[field-bindings/inheritance]: New procedure.
Use it.
* tests/records.scm ("define-record-type* & thunked & no inherited value")
("define-record-type* & thunked & inherited value")
("define-record-type* & thunked & inherited value & this-record"): New tests.
* doc/guix.texi (Defining Package Variants): Update ‘modify-inputs’ example to
refer to ‘inputs’.
(Writing Manifests): Likewise.
* doc/guix-cookbook.texi (Package Variants): Likewise for
‘substitute-keyword-arguments’.
Fixes: https://issues.guix.gnu.org/50335
Change-Id: If4e18155ce203637ff9e116ee8098f8997bfebe2
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/records.scm | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/tests/records.scm b/tests/records.scm index 5464892d3b5..9c071334d50 100644 --- a/tests/records.scm +++ b/tests/records.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2012-2016, 2018-2022 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2012-2016, 2018-2022, 2026 Ludovic Courtès <ludo@gnu.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -238,6 +238,70 @@ (bar? first) (eq? first y))))))) +(test-equal "define-record-type* & thunked & no inherited value" + '(baz) ;the unbound variable + (catch 'unbound-variable + (lambda () + (eval '(begin + (define-record-type* <foo> foo make-foo + foo? + (bar foo-bar) + (baz foo-baz (thunked))) + + ;; There's no inheritance here so 'baz' is unbound in the field + ;; body. Call 'foo-baz' to trigger to unbound variable error. + (foo-baz (foo (bar 1) (baz baz)))) + (test-module))) + (lambda (key proc message arguments . rest) + arguments))) + +(test-equal "define-record-type* & thunked & inherited value" + '(1 22) + (begin + (define-record-type* <foo> foo make-foo + foo? + (bar foo-bar) + (baz foo-baz (thunked))) + + (let* ((parent (foo (bar 1) (baz 2))) + (child (foo (inherit parent) + (baz (* baz 11))))) + (list (foo-bar child) (foo-baz child))))) + +(test-equal "define-record-type* & thunked & inherited value & this-record" + '((1 2) => (21 (inherited . 42))) + (begin + (define-record-type* <foo> foo make-foo + foo? + (bar foo-bar) + (baz foo-baz (thunked))) + + (let* ((parent (foo (bar 1) + (baz (* 2 (foo-bar this-record))))) + (child (foo (inherit parent) + (bar 21) + (baz (cons 'inherited baz))))) + `((,(foo-bar parent) ,(foo-baz parent)) + => + (,(foo-bar child) ,(foo-baz child)))))) + +(test-equal "define-record-type* & thunked & inherited value & sanitizer" + '((1 "2") => (4 "88")) + (begin + (define-record-type* <foo> foo make-foo + foo? + (bar foo-bar) + (baz foo-baz (thunked) (sanitize number->string))) + + (let* ((parent (foo (bar 1) + (baz (* 2 (foo-bar this-record))))) + (child (foo (inherit parent) + (bar 4) + (baz (+ 80 (string->number baz)))))) + `((,(foo-bar parent) ,(foo-baz parent)) + => + (,(foo-bar child) ,(foo-baz child)))))) + (test-assert "define-record-type* & delayed" (begin (define-record-type* <foo> foo make-foo |
