summaryrefslogtreecommitdiff
path: root/guix/records.scm
AgeCommit message (Expand)Author
2022-12-02records: 'match-record' checks fields at macro-expansion time....This allows 'match-record' to be more efficient (field offsets are computed at compilation time) and to report unknown fields at macro-expansion time. * guix/records.scm (map-fields): New macro. (define-record-type*)[rtd-identifier]: New procedure. Define TYPE as a macro and use a separate identifier for the RTD. (lookup-field, match-record-inner): New macros. (match-record): Rewrite in terms of 'match-error-inner'. * tests/records.scm ("match-record, simple") ("match-record, unknown field"): New tests. * gnu/services/cuirass.scm (cuirass-shepherd-service): Rename 'log-file' local variable to 'main-log-file'. * gnu/services/getmail.scm (serialize-getmail-configuration-file): Move after <getmail-configuration-file> definition. Ludovic Courtès
2021-08-12records: Support field sanitizers....* guix/records.scm (make-syntactic-constructor): Add #:sanitizers. [field-sanitizer]: New procedure. [wrap-field-value]: Honor F's sanitizer. (define-record-type*)[field-sanitizer]: New procedure. Pass #:sanitizer to 'make-syntactic-constructor'. * tests/records.scm ("define-record-type* & sanitize") ("define-record-type* & sanitize & thunked"): New tests. Ludovic Courtès
2020-04-08records: Have ABI check work well for cross-compilation....Reported by Jan (janneke) Nieuwenhuizen <janneke@gnu.org>. * guix/records.scm (define-record-type*): Use 'target-most-positive-fixnum' on Guile 3 instead of 'most-positive-fixnum'. Ludovic Courtès
2020-01-16records: Improve reporting of "invalid field specifier" errors....Previously users would just see: error: invalid field specifier without source location or hints. * guix/records.scm (expand): Add optional 'parent-form' parameter and pass it to 'syntax-violation' when it is true. (make-syntactic-constructor): Pass S as a third argument to 'report-invalid-field-specifier'. * guix/ui.scm (report-load-error): For 'syntax-error', show SUBFORM or FORM in the message. * tests/records.scm ("define-record-type* & wrong field specifier"): Add a 'subform' parameter and adjust test accordingly. ("define-record-type* & wrong field specifier, identifier"): New test. * tests/guix-system.sh: Add test. Ludovic Courtès
2019-03-30records: Support custom 'this' identifiers....This lets record users choose an identifier other than 'this-record'. * guix/records.scm (make-syntactic-constructor): Add #:this-identifier. [wrap-field-value]: Honor it. (define-record-type*): Add form with extra THIS-IDENTIFIER and honor it. * tests/records.scm ("define-record-type* & thunked & inherit & custom this"): New test. Ludovic Courtès
2019-03-25records: Allow thunked fields to refer to 'this-record'....* guix/records.scm (this-record): New syntax parameter. (make-syntactic-constructor)[wrap-field-value]: When F is thunked, return a one-argument lambda instead of a thunk, and parameterize THIS-RECORD. (define-record-type*)[thunked-field-accessor-definition]: Pass X to (real-get X). * tests/records.scm ("define-record-type* & thunked & this-record") ("define-record-type* & thunked & default & this-record") ("define-record-type* & thunked & inherit & this-record"): New tests. Ludovic Courtès
2019-01-24records: Make 'report-duplicate-field-specifier' available at expansion-time....Fixes a regression in 'guix pack -R' introduced with commit c2dcff41c2e47f5f978f467864d5ed7829939884. The imported modules of 'c-compiler' would be compiled in this order: first (guix records), then (guix search-paths). Consequently, 'report-duplicate-field-specifier' would be reported as unbound while compiling (guix search-paths), leading to a build failure. * guix/records.scm (report-invalid-field-specifier) (report-duplicate-field-specifier): Move within 'eval-expand'. Ludovic Courtès
2019-01-22records: Detect duplicate field initializers....* guix/records.scm (report-duplicate-field-specifier): New procedure. (make-syntactic-constructor): Call it. * tests/records.scm ("define-record-type* & duplicate initializers"): New test. Co-authored-by: Mark H Weaver <mhw@netris.org> Ludovic Courtès
2018-08-31records: Adjust to test changes in 'record-abi-mismatch-error'....Fixes a test failure introduced in de5cbd4a38a33e0412f1c481fe8e01a871dc13e5. * guix/records.scm (abi-check): Refer to TYPE in an unquoted context so we get at the RTD. * tests/records.scm ("ABI checks"): Adjust 'catch' handler to changes in the 'record-abi-mismatch-error' arguments. Ludovic Courtès
2018-08-29records: Adjust 'record-abi-mismatch-error' arguments....Previously, 'display-error' (as used by 'warn-about-load-error', for instance) would be called with a wrong number of arguments when a 'record-abi-mismatch-error' was caught: warning: failed to load '(gnu tests install)': Backtrace: [...] ERROR: In procedure display-error: Wrong number of arguments to #<procedure display-error (_ _ _ _ _ _)> Now you get warnings and error reports as intended: warning: failed to load '(gnu tests install)': In procedure abi-check: <openssh-configuration>: record ABI mismatch; recompilation needed warning: failed to load '(gnu tests ssh)': In procedure abi-check: <openssh-configuration>: record ABI mismatch; recompilation needed * guix/records.scm (print-record-abi-mismatch-error): Remove. Remove top-level call to 'set-exception-printer!'. (abi-check): Use arguments as expected by 'display-error'. Ludovic Courtès
2018-05-31records: Make a couple of procedures available at expansion time....* guix/records.scm (current-abi-identifier, abi-check): Wrap in 'eval-when'. Ludovic Courtès
2018-05-23records: Insert record type ABI checks in constructors....* guix/records.scm (print-record-abi-mismatch-error): New procedure. <top level>: Add 'set-exception-printer!' call. (current-abi-identifier, abi-check): New procedures. (make-syntactic-constructor): Add #:abi-cookie parameter. Insert calls to 'abi-check'. (define-record-type*)[compute-abi-cookie]: New procedure. Use it and emit a definition of the 'current-abi-identifier' for TYPE. * tests/records.scm ("ABI checks"): New test. Ludovic Courtès
2017-12-01records: Use 'make-struct/no-tail'....* guix/records.scm (make-syntactic-constructor): Use 'make-struct/no-tail' as 'make-struct' is deprecated as of 2.2.3. Ludovic Courtès
2017-11-05guix: records: Add match-record....* guix/records.scm: New syntax-rule. Signed-off-by: Ludovic Courtès <ludo@gnu.org> nee
2017-04-17records: Slight simplification....* guix/records.scm (make-syntactic-constructor): Simplify 'find' expression. Ludovic Courtès
2016-07-14records: Improve reporting of invalid field specifiers....Fixes <http://bugs.gnu.org/23969>. Reported by Vincent Legoll <vincent.legoll@gmail.com>. * guix/records.scm (report-invalid-field-specifier): New procedure. * tests/records.scm ("define-record-type* & wrong field specifier"): New test. Ludovic Courtès
2015-06-11records: Remove unnecessary 'begin'....* guix/records.scm (define-record-type*): Remove unnecessary 'begin'. Ludovic Courtès
2015-06-11records: Add support for 'innate' fields....* guix/records.scm (make-syntactic-constructor): Add #:innate parameter. [record-inheritance]: Honor it. [innate-field?]: New procedure. (define-record-type*)[innate-field?]: New procedure. Pass #:innate to 'make-syntactic-constructor'. * tests/records.scm ("define-record-type* & inherit & innate", "define-record-type* & thunked & innate"): New tests. Ludovic Courtès
2015-06-11records: "options" → "properties"....* guix/records.scm (define-record-type*): Change "options" to "properties". Ludovic Courtès
2015-06-11records: Factorize field property predicates....* guix/records.scm (define-field-property-predicate): New macro. (define-record-type*)[thunked-field?, delayed-field?]: Use it. Ludovic Courtès
2015-06-11records: Separate default-value handling....* guix/records.scm (make-syntactic-constructor)[default-values]: New variable. [field-default-value]: New procedure. Use them. Ludovic Courtès
2015-06-11records: Replace 'eval-when' with a proper 'define-syntax'....* guix/records.scm (make-syntactic-constructor): Remove enclosing 'eval-when'. Turn into a 'syntax-rules' macro. Ludovic Courtès
2015-05-04records: Make 'make-syntactic-constructor' available at load/eval/expand....* guix/records.scm (make-syntactic-constructor): Wrap in 'eval-when'. Ludovic Courtès
2015-01-19records: Add support for delayed fields....* guix/records.scm (make-syntactic-constructor): Add #:delayed parameter. [delayed-field?]: New procedure. [wrap-field-value]: Use it. (define-record-type*)[delayed-field?, wrapped-field?]: New procedures. [thunked-field-accessor-name]: Rename to... [wrapped-field-accessor-name]: ... this. [field-spec->srfi-9]: Change 'thunked' to 'wrapped'. [delayed-field-accessor-definition]: New procedure. Compute delayed-field accessors and emit them. Pass #:delayed to 'make-syntactic-constructor'. * tests/records.scm ("define-record-type* & delayed", "define-record-type* & delayed & default", "define-record-type* & delayed & inherited"): New tests. Ludovic Courtès
2015-01-19make-syntactic-constructor kwarg defaultLudovic Courtès
2015-01-19records: Factorize value wrapping in the record constructor....* guix/records.scm (make-syntactic-constructor)[wrap-field-value]: New procedure. [field-bindings, field-value]: Use it. Ludovic Courtès
2015-01-19records: Move 'make-syntactic-constructor' to the top level....* guix/records.scm (make-syntactic-constructor): New procedure, formerly nested in 'define-record-type*'. Ludovic Courtès
2015-01-19records: Use keyword parameters for 'make-syntactic-constructor'....* guix/records.scm (define-record-type*)[make-syntactic-constructor]: Turn THUNKED and DEFAULTS into keyword arguments. Adjust caller accordingly. Declare 'thunked' and 'defaults' local variables. Ludovic Courtès
2015-01-09records: Optimize 'recutils->alist' by avoiding regexps....* guix/records.scm (%recutils-field-rx, %recutils-comment-rx, %recutils-plus-rx): Remove. (%recutils-field-charset): New variable. (recutils->alist): Adjust to use tests (string-ref line 0) instead of regexps. Ludovic Courtès
2014-10-17records: Improve the docstring of 'define-record-type*'....* guix/records.scm (define-record-type*): Agument the docstring, give examples. Ludovic Courtès
2014-07-17records: Report unknown field names in inheriting forms....* guix/records.scm (define-record-type*)[record-inheritance]: Check for unexpected field names. * tests/records.scm ("define-record-type* with let* behavior"): Return #t, not *unspecified*. ("define-record-type* & inherit & extra initializers"): New test. Ludovic Courtès
2014-07-17records: Factorize error-reporting macro....* guix/records.scm (record-error): New macro. (define-record-type*)[error*]: Remove. Use 'record-error' instead. Ludovic Courtès
2013-10-15records: define-record-type*: Field bindings are bound with 'let*'....* guix/records.scm (define-record-type*): Wrap field bindings in a 'let*', not in a 'letrec*', which turned out to be pointlessly inconvenient. * tests/records.scm: Adjust test names accordingly. Ludovic Courtès
2013-07-10records: `recutils->alist' recognizes lines starting with a `+'....* guix/records.scm (%recutils-plus-rx): New variable. (recutils->alist): Use it to read + lines. * tests/records.scm ("recutils->alist with + lines"): New test. Ludovic Courtès
2013-07-10records: `alist->record' supports multiple-field occurrences....* guix/records.scm (alist->record): Add `multiple-value-keys' parameter. Update docstring, and honor it. * tests/records.scm ("alist->record"): New record. Ludovic Courtès
2013-07-10records: `recutils->alist' recognizes comments....* guix/records.scm (%recutils-comment-rx): New variable. (recutils->alist): Match comments. * tests/records.scm ("recutils->alist"): Add comments. Ludovic Courtès
2013-07-10records: Add `recutils->alist' for public consumption....* guix/records.scm (%recutils-field-rx): New variable. (recutils->alist): New procedure, formerly known as `fields->alist'. * guix/scripts/substitute-binary.scm (fields->alist): Use it. * tests/records.scm ("recutils->alist"): New test. Ludovic Courtès
2013-05-12Move record utilities to (guix records)....* guix/utils.scm (define-record-type*): Move to... * guix/records.scm: ... here. New file. * guix/build-system.scm, guix/packages.scm: Use it. * guix/gnu-maintenance.scm: Likewise. (official-gnu-packages)[alist->record]: Remove. * guix/scripts/substitute-binary.scm: Likewise. (alist->record, object->fields): Remove. * tests/utils.scm ("define-record-type*", "define-record-type* with letrec* behavior", "define-record-type* & inherit", "define-record-type* & inherit & letrec* behavior", "define-record-type* & thunked", "define-record-type* & thunked & default", "define-record-type* & thunked & inherited"): Move to... * tests/records.scm: ... here. New file. Ludovic Courtès