mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-11-07 07:26:13 -05:00
packages: Turn 'cache!' into a single-value-return cache.
* guix/packages.scm (cache!): Assume THUNK returns a single value. (cached): Likewise.
This commit is contained in:
parent
b334674fe5
commit
0b1be8fd57
1 changed files with 5 additions and 7 deletions
|
@ -870,14 +870,14 @@ (define (cache! cache package system thunk)
|
|||
SYSTEM."
|
||||
;; FIXME: This memoization should be associated with the open store, because
|
||||
;; otherwise it breaks when switching to a different store.
|
||||
(let ((vals (call-with-values thunk list)))
|
||||
(let ((result (thunk)))
|
||||
;; Use `hashq-set!' instead of `hash-set!' because `hash' returns the
|
||||
;; same value for all structs (as of Guile 2.0.6), and because pointer
|
||||
;; equality is sufficient in practice.
|
||||
(hashq-set! cache package
|
||||
`((,system ,@vals)
|
||||
`((,system . ,result)
|
||||
,@(or (hashq-ref cache package) '())))
|
||||
(apply values vals)))
|
||||
result))
|
||||
|
||||
(define-syntax cached
|
||||
(syntax-rules (=>)
|
||||
|
@ -889,10 +889,8 @@ (define-syntax cached
|
|||
(match (hashq-ref cache package)
|
||||
((alist (... ...))
|
||||
(match (assoc-ref alist key)
|
||||
((vals (... ...))
|
||||
(apply values vals))
|
||||
(#f
|
||||
(cache! cache package key thunk))))
|
||||
(#f (cache! cache package key thunk))
|
||||
(value value)))
|
||||
(#f
|
||||
(cache! cache package key thunk)))))
|
||||
((_ package system body ...)
|
||||
|
|
Loading…
Reference in a new issue