Hi, Nikita Karetnikov <nik...@karetnikov.org> skribis:
> This one doesn't work at all: > > (option '("foo") #f #t > (lambda (opt name arg result) > (alist-cons 'foo arg result))) It actually does, but it has no side effect. ‘args-fold’ uses a common functional programming pattern, whereby the functions called when an option is encountered just /contribute/ to the resulting value. Here’s an example: --8<---------------cut here---------------start------------->8--- scheme@(guile-user)> (use-modules(srfi srfi-37)) scheme@(guile-user)> (define options (list (option '("foo") #f #t (lambda (opt name arg result) (if arg (cons arg result) 'nothing))))) scheme@(guile-user)> (args-fold '("--foo") options (const #f) (const #f) '(something)) $19 = nothing scheme@(guile-user)> (args-fold '("--foo=42") options (const #f) (const #f) '(something)) $20 = ("42" something) scheme@(guile-user)> (args-fold '("--foo=42" "--foo=3") options (const #f) (const #f) '(something)) $21 = ("3" "42" something) scheme@(guile-user)> (args-fold '("--foo=42" "--foo=3" "--foo") options (const #f) (const #f) '(something)) $22 = nothing --8<---------------cut here---------------end--------------->8--- In guix-package, ‘parse-options’ returns an alist (list of pairs) that indicates the actions to be performed, etc. IOW, ‘args-fold’ is a tool to build “translators” from command-line options to an internal representation of those options. > Actually, the above helped me to understand that we want '--roll-back' > to behave differently than '--foo'. '--roll-back' shouldn't accept any > options at all, but it should somehow get the argument of '--profile'. > How can I do it? When ‘--profile’ is passed, the result of ‘parse-options’ contains a pair whose key is ‘profile’. The (assoc-ref opts 'profile) calls that you see retrieve the argument given to ‘--profile’. Ludo’.