diff options
Diffstat (limited to 'share')
-rw-r--r-- | share/txr/stdlib/compiler.tl | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl index 8b8baa20..4d776296 100644 --- a/share/txr/stdlib/compiler.tl +++ b/share/txr/stdlib/compiler.tl @@ -815,7 +815,7 @@ (uni (diff bfrag.ffuns lexfuns) (if rec (diff ffuns lexfuns) ffuns)))))))) -(defmeth compiler comp-lambda (me oreg env form) +(defmeth compiler comp-lambda-impl (me oreg env form) (mac-param-bind form (op par-syntax . body) form (let* ((*load-time* nil) (pars (new (fun-param-parser par-syntax form))) @@ -913,6 +913,20 @@ (uni [reduce-left uni ifrags nil .ffuns] bfrag.ffuns))))))))) +(defmeth compiler comp-lambda (me oreg env form) + (if *load-time* + me.(comp-lambda-impl oreg env form) + (let* ((lambda-frag me.(comp-lambda-impl oreg env form)) + (ok-lift-var-pov (all lambda-frag.fvars + (lambda (sym) + (not env.(lookup-var sym))))) + (ok-lift-fun-pov (all lambda-frag.ffuns + (lambda (sym) + (not env.(lookup-fun sym)))))) + (if (and ok-lift-var-pov ok-lift-fun-pov) + me.(compile oreg env ^(sys:load-time-lit nil ,form)) + lambda-frag)))) + (defmeth compiler comp-fun (me oreg env form) (mac-param-bind form (op arg) form (let ((fbin env.(lookup-fun arg t))) |