gexp: Reduce allocations in 'gexp-attribute'.

* guix/gexp.scm (gexp-attribute): Use 'fold' and 'fold/tree' instead of
'append-map'.
This commit is contained in:
Ludovic Courtès 2021-02-23 14:19:48 +01:00
parent c8bd5fa59c
commit fcde4e10b8
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5

View file

@ -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-input> (? gexp? exp))
(gexp-attribute exp self-attribute
#:validate validate))
(($ <gexp-input> (lst ...))
(append-map (lambda (item)
(gexp-attribute item self-attribute
#:validate
validate))
lst))
(_
'()))
(gexp-references gexp)))
(reverse
(fold (lambda (input result)
(match input
(($ <gexp-input> (? gexp? exp))
(append (gexp-attribute exp self-attribute
#:validate validate)
result))
(($ <gexp-input> (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