Add cache for `resolve-once'.

Substantial speedups on "new-metrics.rkt" test.

original commit: 79061150efbc304ac6b9c3f74ba0ac0df342857e
This commit is contained in:
Sam Tobin-Hochstadt 2011-04-18 20:54:45 -04:00
parent 13b93f380a
commit 70e0482625

View File

@ -1,7 +1,7 @@
#lang scheme/base
(require "../utils/utils.rkt")
(require (rep type-rep)
(require (rep type-rep rep-utils)
(env type-name-env)
(utils tc-utils)
(types utils)
@ -46,12 +46,20 @@
(define (needs-resolving? t)
(or (Mu? t) (App? t) (Name? t)))
(define resolver-cache (make-hasheq))
(define (resolve-once t)
(match t
[(Mu: _ _) (unfold t)]
[(App: r r* s)
(resolve-app r r* s)]
[(Name: _) (resolve-name t)]))
(define seq (Rep-seq t))
(define r (hash-ref resolver-cache seq #f))
(or r
(let ([r* (match t
[(Mu: _ _) (unfold t)]
[(App: r r* s)
(resolve-app r r* s)]
[(Name: _) (resolve-name t)])])
(when r*
(hash-set! resolver-cache seq r*))
r*)))
(define (resolve t)
(if (needs-resolving? t) (resolve-once t) t))