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:
Ludovic Courtès 2017-03-16 13:41:51 +01:00
parent 34d60c49cb
commit 146db52a18
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
1 changed files with 10 additions and 11 deletions

View File

@ -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))))