Hello, Nicolas Goaziou <m...@nicolasgoaziou.fr> skribis:
> Ludovic Courtès <l...@gnu.org> writes: [...] >> • Packages such as ‘tzdata’ use labels to refer to non-package >> inputs. These cannot be converted to the automatic labeling >> style, or not without extra changes. > > Would it be possible to write something like > > (inputs (let ((tzcode (origin ...))) > (list ... tzcode ...))) > > ? Yes, but the problem is that the automatically-assigned label for <origin> records is “_” (a placeholder), because origins have no name, unlike packages. Thus, this phase: (replace 'unpack (lambda* (#:key source inputs #:allow-other-keys) (invoke "tar" "xvf" source) (invoke "tar" "xvf" (assoc-ref inputs "tzcode")))) … needs to be written differently, because there’s no “tzcode” label. One option on ‘core-updates’ is to use gexps: #~(modify-phases %standard-phases ;; … (replace 'unpack (lambda* (#:key source inputs #:allow-other-keys) (invoke "tar" "xvf" source) (invoke "tar" "xvf" #$tzcode)))) However, this style breaks common uses of ‘inherit’ and uses of the inputs field: ‘tzcode’ here need not even be listed in ‘inputs’, and consequently, you cannot easily inherit from ‘tzdata’ and give it a different ‘tzcode’. We need to find and encourage appropriate idioms for corner cases like this. One option is the status quo: keep using labels in those rare cases. A crazier option would be to interpret input lists, when possible, as both input lists and formal parameter lists for ‘arguments’. Assume a package with: (inputs (list foo bar baz)) The ‘arguments’ field, which is currently a thunk, would magically be turned into: (lambda (foo bar baz) …) That way, arguments could refer to #$foo etc., and that’d just do the right thing when inputs are overridden. This would be reaching a level of magic that may not be wise, and it may be hard to implement. > Could the new syntax accept both variables and specifications, e.g., > > (list "glib:bin" foo "bar@2.3") > > ? No! I mean, yes it could, but no, I don’t think that’s a good idea. :-) In terms of API, I prefer clarity; in this case, I think inputs should be a list of packages or other “lowerable” objects, rather than a list of “anything” that could be magically interpreted at run time. More importantly, I think package specs are a UI feature, and that packages should be separate from UI concerns. Specs are implemented in (gnu packages), not in (guix …) for a reason: it’s a feature that makes sense in the distro, not in the core Guix machinery where there’s no “package set” to traverse. I hope that makes sense! Ludo’.