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 /share | |
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.
Diffstat (limited to 'share')
-rw-r--r-- | share/txr/stdlib/compiler.tl | 1 |
1 files changed, 1 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)) |