diff options
-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. |