On 2024-05-22 17:33, Richard Sent wrote: > Andrew Tropin writes: > >> After rewriting from car/cdr to match-lambda in v2 of this patch: >> https://yhetil.org/guix-patches/3394b0b51f6a5a608ebcfb7a63fdc34e52fe928e.1711046203.git.richard@freakingpenguin.com/ >> >> the format changed from pairs to lists, I didn't noticed this nuance >> during review because the documentation still says that service should >> be configured and extended with pairs. Also, pairs are more >> apropriate data type here. And this match-lambda rewrite will break >> downstream RDE user's setups after migrating to upstreamed version of >> service. >> >> That's why I propose to go back to pairs. >> > > I'm not opposed to going back to cons cell pairs. I didn't put too much > thought in a "list of two elements" vs. "cons cell" besides the match > statement being easier to handle with a list. > > Would this patch have unintended side effects? I thought the . in match > conditions had a different behavior. > > --8<---------------cut here---------------start------------->8--- > scheme@(guile-user)> (match '(1 2 3 4) > ((a . b) b)) > $5 = (2 3 4) > scheme@(guile-user)> (match '(1 2) > ((a . b) b)) > $6 = (2) > scheme@(guile-user)> (match '(1 . 2) > ((a . b) b)) > $7 = 2 > --8<---------------cut here---------------end--------------->8--- > > So changing to this would allow for a home-service entry like the > following to match: > > --8<---------------cut here---------------start------------->8--- > (simple-service 'my-extra-home home-service-type > `(("bob" "bill" "bertha" "billyanne" ,my-extra-home ,my-home-2))) > --8<---------------cut here---------------end--------------->8--- > > From my testing, this /will/ error (yay), but not as soon as the match > would with the current code. Instead of being caught before being passed > to the daemon, it seems to be caught while lowering the invalid > file-append object. > > Personally I would prefer to catch as many errors as possible before > beginning to pass code off to the daemon where possible. Generally > speaking it feels like pre-daemon errors are easier to mentally parse. > > In fairness, the current code also isn't trying particularly hard to > check that "user" is a string and "he" is a home-environment or printing > a fancy error message. > > Perhaps this would work? > > --8<---------------cut here---------------start------------->8--- > (define-module (gnu services guix) > ... > #:use-module (gnu home)) > ... > (define (guix-home-shepherd-service config) > (map (match-lambda > (((? string? user) . (? home-environment? he)) > (shepherd-service > ... > )) > (e (error "Invalid value for guix-home-shepherd-service: " e))) > config)) > --8<---------------cut here---------------end--------------->8--- This idea is good, I'll incorporate this into v2. > > Maybe I'm just being silly. 🙂 -- Best regards, Andrew Tropin