diff options
author | Ludovic Courtès <ludo@gnu.org> | 2017-03-16 13:41:51 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2017-03-16 22:50:15 +0100 |
commit | 146db52a188b871769d9512867aa7f409f37dbac (patch) | |
tree | da18d84a0409ba057e1ce3febb3e6407b7288592 | |
parent | 34d60c49cbffcee2bdaec32f0bfe2fef1c1ea8e6 (diff) | |
download | patches-146db52a188b871769d9512867aa7f409f37dbac.tar patches-146db52a188b871769d9512867aa7f409f37dbac.tar.gz |
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.
-rw-r--r-- | guix/memoization.scm | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/guix/memoization.scm b/guix/memoization.scm index d64f60fe9c..5cae283610 100644 --- a/guix/memoization.scm +++ b/guix/memoization.scm @@ -31,9 +31,6 @@ (define-syntax-rule (return/1 value) value) -(define %nothing ;nothingness - (list 'this 'is 'nothing)) - (define-syntax define-cache-procedure (syntax-rules () "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 returns." ((_ name hash-ref hash-set! call return) - (define (name cache key thunk) - "Cache the result of THUNK under KEY in CACHE, or return the + (define name + (let ((%nothing '(this is nothing))) + (lambda (cache key thunk) + "Cache the result of THUNK under KEY in CACHE, or return the already-cached result." - (let ((results (hash-ref cache key %nothing))) - (if (eq? results %nothing) - (let ((results (call thunk))) - (hash-set! cache key results) - (return results)) - (return results))))) + (let ((results (hash-ref cache key %nothing))) + (if (eq? results %nothing) + (let ((results (call thunk))) + (hash-set! cache key results) + (return results)) + (return results))))))) ((_ name hash-ref hash-set!) (define-cache-procedure name hash-ref hash-set! call/mv return/mv)))) |