memoization: Micro-optimize code produced by 'define-cache-procedure'.
* guix/memoization.scm (%nothing): Remove. (define-cache-procedure): Make '%nothing' a local variable, with a literal list.
This commit is contained in:
parent
34d60c49cb
commit
146db52a18
|
@ -31,9 +31,6 @@
|
||||||
(define-syntax-rule (return/1 value)
|
(define-syntax-rule (return/1 value)
|
||||||
value)
|
value)
|
||||||
|
|
||||||
(define %nothing ;nothingness
|
|
||||||
(list 'this 'is 'nothing))
|
|
||||||
|
|
||||||
(define-syntax define-cache-procedure
|
(define-syntax define-cache-procedure
|
||||||
(syntax-rules ()
|
(syntax-rules ()
|
||||||
"Define a procedure NAME that implements a cache using HASH-REF and
|
"Define a procedure NAME that implements a cache using HASH-REF and
|
||||||
|
@ -41,15 +38,17 @@ HASH-SET!. Use CALL to invoke the thunk and RETURN to return its value; CALL
|
||||||
and RETURN are used to distinguish between multiple-value and single-value
|
and RETURN are used to distinguish between multiple-value and single-value
|
||||||
returns."
|
returns."
|
||||||
((_ name hash-ref hash-set! call return)
|
((_ name hash-ref hash-set! call return)
|
||||||
(define (name cache key thunk)
|
(define name
|
||||||
"Cache the result of THUNK under KEY in CACHE, or return the
|
(let ((%nothing '(this is nothing)))
|
||||||
|
(lambda (cache key thunk)
|
||||||
|
"Cache the result of THUNK under KEY in CACHE, or return the
|
||||||
already-cached result."
|
already-cached result."
|
||||||
(let ((results (hash-ref cache key %nothing)))
|
(let ((results (hash-ref cache key %nothing)))
|
||||||
(if (eq? results %nothing)
|
(if (eq? results %nothing)
|
||||||
(let ((results (call thunk)))
|
(let ((results (call thunk)))
|
||||||
(hash-set! cache key results)
|
(hash-set! cache key results)
|
||||||
(return results))
|
(return results))
|
||||||
(return results)))))
|
(return results)))))))
|
||||||
((_ name hash-ref hash-set!)
|
((_ name hash-ref hash-set!)
|
||||||
(define-cache-procedure name hash-ref hash-set!
|
(define-cache-procedure name hash-ref hash-set!
|
||||||
call/mv return/mv))))
|
call/mv return/mv))))
|
||||||
|
|
Loading…
Reference in New Issue