Hi, In Guile module (ice-9 vlist), one reads:
--8<---------------cut here---------------start------------->8--- ;; Asserting that something is a vlist is actually a win if your next ;; step is to call record accessors, because that causes CSE to ;; eliminate the type checks in those accessors. ;; (define-inlinable (assert-vlist val) (unless (vlist? val) (throw 'wrong-type-arg #f "Not a vlist: ~S" (list val) (list val)))) [...] (define (vlist-head vlist) "Return the head of VLIST." (assert-vlist vlist) (let ((base (vlist-base vlist)) (offset (vlist-offset vlist))) (block-ref (block-content base) offset))) --8<---------------cut here---------------end--------------->8--- Other said, the argument ’vlist’ is “type-checked” with ’assert-vlist’ and thus that is exploited by Guile compiler, if I understand correctly the comment. The first question is: is it still correct? Because this module had been implemented before many Guile compiler improvements. The second question, if the comment above is still valid, is: could we also “win” for some record inside Guix source code? Concretely, one example about the record <package>, there is some procedures such that: --8<---------------cut here---------------start------------->8--- (define* (package->manifest-entry package #:optional (output "out") #:key (parent (delay #f)) (properties (default-properties package))) "Return a manifest entry for the OUTPUT of package PACKAGE." ;; For each dependency, keep a promise pointing to its "parent" entry. (letrec* ((deps (map (match-lambda ((label package) (package->manifest-entry package #:parent (delay entry))) ((label package output) (package->manifest-entry package output #:parent (delay entry)))) (package-propagated-inputs package))) (entry (manifest-entry (name (package-name package)) (version (package-version package)) (output output) (item package) (dependencies (delete-duplicates deps)) (search-paths (package-transitive-native-search-paths package)) (parent parent) (properties properties)))) entry)) --8<---------------cut here---------------end--------------->8--- which fits the comment above: a record as argument and record accessor call. And that could also be applied to other records, I guess. Any answers, explanations or references are very welcome. :-) Cheers, simon PS: Raining day and weird pastime… diving into Guile source code. ;-)