diff --git a/guix/gexp.scm b/guix/gexp.scm index cad57f62ca..8cd44ba534 100644 --- a/guix/gexp.scm +++ b/guix/gexp.scm @@ -757,19 +757,28 @@ (define* (gexp-attribute gexp self-attribute #:optional (equal? equal?) (append (let ((attribute (self-attribute gexp))) (validate gexp attribute) attribute) - (append-map (match-lambda - (($ (? gexp? exp)) - (gexp-attribute exp self-attribute - #:validate validate)) - (($ (lst ...)) - (append-map (lambda (item) - (gexp-attribute item self-attribute - #:validate - validate)) - lst)) - (_ - '())) - (gexp-references gexp))) + (reverse + (fold (lambda (input result) + (match input + (($ (? gexp? exp)) + (append (gexp-attribute exp self-attribute + #:validate validate) + result)) + (($ (lst ...)) + (fold/tree (lambda (obj result) + (match obj + ((? gexp? exp) + (append (gexp-attribute exp self-attribute + #:validate validate) + result)) + (_ + result))) + result + lst)) + (_ + result))) + '() + (gexp-references gexp)))) equal?) '())) ;plain Scheme data type