> I'm not sure how the expansion would be usable in the module it is > defined? It seems I could manage to get 'manifest->friendly-name' to be > a procedure returning a gexp, but that gexp wouldn't be readily usable > in that module (it could only be used when gexp-unquote from inside > another G-Exp), and the expansion in the macro above doesn't bind any > identifier, unless I'm missing something? The macro does two things: define a procedure manifest->friendly-name that returns a string. (define (manifest->friendly-name manifest) "Return a friendly name computed from the entries in MANIFEST, a object." (let loop ((names (map manifest-entry-name (manifest-entries manifest)))) (define str (string-join names "-")) (if (< (string-length str) 40) str (match names ((_) str) ((names ... _) (loop names))))))) ;drop one entry and also define a G-exp define-manifest->friendly-name (define define-manifest->friendly-nam #~(define (manifest->friendly-name manifes) "Return a friendly name [...]" [...]) Testing from a REPL: $ guix repl (use-modules (guix gexp) (ice-9 match) (guix profiles)) (define-syntax define-gexp-and-expand (syntax-rules () ((_ variable code) ; code* ... turned out to be unnecessary (begin (define variable #~code) code)))) (define-gexp-and-expand define-manifest->friendly-name (define (manifest->friendly-name manifest) "Return a friendly name computed from the entries in MANIFEST, a object." (let loop ((names (map manifest-entry-name (manifest-entries manifest)))) (define str (string-join names "-")) (if (< (string-length str) 40) str (match names ((_) str) ((names ... _) (loop names))))))) ;drop one entry $ define-manifest->friendly-name $3 = #friendly-name manifest) "Return a friendly name computed from the entries in MANIFEST, a\n object." (let loop ((names (map manifest-entry-name (manifest- entries manifest)))) (define str (string-join names "-")) (if (< (string-length str) 40) str (match names ((_) str) ((names ... _) (loop names)))))) 7f4b3c5ee5a0> $ (manifest->friendly-name (specifications->manifest '("guile"))) $8 = "guile" Seems to work. Greetings, Maxime.