summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2026-03-06 18:46:35 +0100
committerLudovic Courtès <ludo@gnu.org>2026-03-20 13:27:15 +0100
commita7c8e68dc51144a6d3981b770aca9c4897fc7c0c (patch)
tree9e1f59985c9d536e71a71860cdf892c2a497d17c /tests
parente1457c467953b871d14214f6d617fdfea8ab15c1 (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.scm66
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