Hi, >>This is because each of those "CLI calls" end up running `(exit 0)` >>at the end in some form or another.
Quote: What do guixers think of having a repl macro that allows you to run commands like if you were using the CLI? <https://yhetil.org/guix/20220703131112.GB5967@gac> therefore using (guix-package "-s" "non-existent") «allows you to run commands like if you were using the CLI». ;-) > Should they? Is this an accepted pattern in the functional style to > which Guix tries to adhere? > > (I don't know! It just caught me by surprise.) For instance it reads, --8<---------------cut here---------------start------------->8--- (define %options ;; Specification of the command-line options. (cons* (option '(#\h "help") #f #f (lambda args (show-help) (exit 0))) --8<---------------cut here---------------end--------------->8--- or elsewhere for another instance, --8<---------------cut here---------------start------------->8--- (define (handle-argument arg result arg-handler) ;; Process non-option argument ARG by calling back ARG-HANDLER. (if arg-handler (arg-handler arg result) (leave (G_ "~A: extraneous argument~%") arg))) --8<---------------cut here---------------end--------------->8--- where ’leave’ reads, --8<---------------cut here---------------start------------->8--- (define-syntax-rule (leave args ...) "Emit an error message and exit." (begin (report-error args ...) (exit 1))) --8<---------------cut here---------------end--------------->8--- It appears to me expected that the imperative CLI called from shell returns meaningful code that the shell caller can use. I do not know what is expected for working at the REPL. The direct use ’define-command’ is a quick workaround. Other said, the run of scheme@(guix-user)> (guix-package "-s" "hello") instead of the CLI “guix package -s hello” is just to expose an entry point for the Scheme API. Because the procedure ’guix-package’ is to somehow make a compatible layer between the functional style with the imperative shell world – hence all the ’leave’ or ’warning’ glue code. Except some corner cases, the general idea, from my understanding, is to have all the impure/imperative code under guix/scripts/. Although it is sadly more than often not the case; give a look at (gnu packages) for instance. Anyway. Well, the functional style at the REPL would to directly use for example ’find-packages-by-description’ or the like; although this procedure is not exposed by the API. All that said, maybe it could be nice to extend the current meta-commands of the REPL. What would be the need between the current CLI and the current Scheme API? Maybe all the ’leave’ and ’exit’ could be wrapped using an hypothetical ’maybe-exit’ catching if it is called from REPL or not. Is it possible to detect if an interactive call? I was thinking to add a global parameter in ’(guix scripts repl) and then this new ’maybe-exit’ could check it; but I guess Guile provides a better mechanism for checking interactiveness. Cheers, simon