added metafunction result caching
svn: r11883
This commit is contained in:
parent
c0bc68f35b
commit
d1b2bf63c7
|
@ -1046,8 +1046,13 @@
|
||||||
[codom-compiled-pattern (compile-pattern lang codom-contract-pat #f)])
|
[codom-compiled-pattern (compile-pattern lang codom-contract-pat #f)])
|
||||||
(values
|
(values
|
||||||
(wrap
|
(wrap
|
||||||
(letrec ([metafunc
|
(letrec ([cache (make-hash)]
|
||||||
|
[not-in-cache (gensym)]
|
||||||
|
[metafunc
|
||||||
(λ (exp)
|
(λ (exp)
|
||||||
|
(let ([cache-ref (hash-ref cache exp not-in-cache)])
|
||||||
|
(cond
|
||||||
|
[(eq? cache-ref not-in-cache)
|
||||||
(when dom-compiled-pattern
|
(when dom-compiled-pattern
|
||||||
(unless (match-pattern dom-compiled-pattern exp)
|
(unless (match-pattern dom-compiled-pattern exp)
|
||||||
(redex-error name
|
(redex-error name
|
||||||
|
@ -1078,7 +1083,10 @@
|
||||||
(let ([ans (rhs metafunc (mtch-bindings (car mtchs)))])
|
(let ([ans (rhs metafunc (mtch-bindings (car mtchs)))])
|
||||||
(unless (match-pattern codom-compiled-pattern ans)
|
(unless (match-pattern codom-compiled-pattern ans)
|
||||||
(redex-error name "codomain test failed for ~s, call was ~s" ans `(,name ,@exp)))
|
(redex-error name "codomain test failed for ~s, call was ~s" ans `(,name ,@exp)))
|
||||||
ans)])))])))])
|
(hash-set! cache exp ans)
|
||||||
|
ans)])))]))]
|
||||||
|
[else
|
||||||
|
cache-ref])))])
|
||||||
metafunc)
|
metafunc)
|
||||||
compiled-patterns
|
compiled-patterns
|
||||||
rhss)
|
rhss)
|
||||||
|
|
|
@ -840,6 +840,11 @@ Raises an exception recognized by @scheme[exn:fail:redex?] if
|
||||||
no clauses match, if one of the clauses matches multiple ways, or
|
no clauses match, if one of the clauses matches multiple ways, or
|
||||||
if the contract is violated.
|
if the contract is violated.
|
||||||
|
|
||||||
|
Note that metafunctions are assumed to always return the same results
|
||||||
|
for the same inputs, and their results are cached. Accordingly, if a
|
||||||
|
metafunction is called with the same inputs twice, then its body is
|
||||||
|
only evaluated a single time.
|
||||||
|
|
||||||
As an example, these metafunctions finds the free variables in
|
As an example, these metafunctions finds the free variables in
|
||||||
an expression in the lc-lang above:
|
an expression in the lc-lang above:
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user