diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2020-05-03 09:11:33 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2020-05-03 09:11:33 -0700 |
commit | 898e55a66e8011140257057e4faa52f4cb74648b (patch) | |
tree | 5a3fdc8fa1e626360b8933c2672c90a1929e0c4f | |
parent | b64e6bc1e540b5f580c888ea1b6aeaccaf9d6b61 (diff) | |
download | txr-898e55a66e8011140257057e4faa52f4cb74648b.tar.gz txr-898e55a66e8011140257057e4faa52f4cb74648b.tar.bz2 txr-898e55a66e8011140257057e4faa52f4cb74648b.zip |
compiler: honor load-time in parts of loop.
* share/txr/stdlib/compiler.tl (compiler comp-for): If a for
loop occurs in the top level, or inside a load-time, then we
don't want to suppress the semantics of load-time for any
parts of the loop that are repeatedly evaluated. The
programmer may be doing that specifically to hoist those
calculations out of the loop. We thus bind *load-time* to nil
after compiling the initializing and test expressions.
* txr.1: New paragraph in Notes for load-time, mentioning
compiler treatment of loops and lambda. The language is
deliberately general rather than being specifically about the
for loop, because several loop constructs compile to the for
loop, and that is also subject to future changes.
-rw-r--r-- | share/txr/stdlib/compiler.tl | 1 | ||||
-rw-r--r-- | txr.1 | 14 |
2 files changed, 15 insertions, 0 deletions
diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl index 88792259..8b8baa20 100644 --- a/share/txr/stdlib/compiler.tl +++ b/share/txr/stdlib/compiler.tl @@ -1087,6 +1087,7 @@ (mac-param-bind form (op inits (: (test nil test-p) . rets) incs . body) form (let* ((treg me.(alloc-treg)) (ifrag me.(comp-progn treg env inits)) + (*load-time* nil) (tfrag (if test-p me.(compile oreg env test))) (rfrag me.(comp-progn oreg env rets)) (nfrag me.(comp-progn treg env incs)) @@ -71539,6 +71539,20 @@ closure which is returned. Invoking the closure doesn't cause the .code load-time expressions to be evaluated. +The +.code load-time +form is subject to compiler optimizations. A top-level expression is assumed to +be evaluated in load time, so +.code load-time +does nothing in a top-level expression. It becomes active inside forms +embedded in a +.code lambda +expressions. Since +.code load-time +may be used to hoist calculations outside of loops, +.code load-time +is also active in those parts of loops which are repeatedly evaluated. + The use of .code load-time is similar to defining a variable and then referring to the variable. |