shithub: femtolisp

Download patch

ref: e877c7e9901fde9cc61276d66936fc3a58db1d4d
parent: 7965ff00950c33760a8153e29173ac1b82b6009f
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Mon Nov 25 20:08:38 EST 2024

import "inline lambdas in head position (i.e. `let`)" from Julia's femtolisp

This is 5e949d7915210b6f2e9326f16f1e336a3460dac9 from Julia. Original
change by Jeff Bezanson.

--- a/compiler.lsp
+++ b/compiler.lsp
@@ -2,11 +2,13 @@
 
 ;; code generation state, constant tables, bytecode encoding
 
-(define (make-code-emitter) (vector () (table) 0 ()))
+(define (make-code-emitter) (vector () (table) 0 () 0))
 (define (bcode:code   b) (aref b 0))
 (define (bcode:ctable b) (aref b 1))
 (define (bcode:nconst b) (aref b 2))
 (define (bcode:cenv   b) (aref b 3))
+(define (bcode:sp     b) (aref b 4))
+(define (bcode:stack  b n) (aset! b 4 (+ (aref b 4) n)))
 
 ;; get an index for a referenced value in a bytecode object
 (define (bcode:indexfor b v)
@@ -230,7 +232,9 @@
                           (capture-var! g s))))
             (if h?
                 (begin (emit g (if arg? 'loada 'loadc) idx)
+                       (bcode:stack g 1)
                        (compile-in g env #f rhs)
+                       (bcode:stack g -1)
                        (emit g 'set-car!))
 
                 (begin (compile-in g env #f rhs)
@@ -237,6 +241,13 @@
                        (if (not arg?) (error (string "internal error: misallocated var " s)))
                        (emit g 'seta idx))))))))
 
+(define (box-vars g env)
+  (let loop ((e env))
+    (if (pair? e)
+    (begin (if (cadr (car e))
+               (emit g 'box (caddr (car e))))
+               (loop (cdr e))))))
+
 ;; control flow
 
 (define (compile-if g env tail? x)
@@ -274,17 +285,21 @@
 (define (compile-prog1 g env x)
   (compile-in g env #f (cadr x))
   (if (pair? (cddr x))
-      (begin (compile-begin g env #f (cddr x))
-             (emit g 'pop))))
+      (begin (bcode:stack g 1)
+             (compile-begin g env #f (cddr x))
+             (emit g 'pop)
+             (bcode:stack g -1))))
 
 (define (compile-while g env cond body)
   (let ((top  (make-label g))
         (end  (make-label g)))
     (compile-in g env #f (void))
+    (bcode:stack g 1)
     (mark-label g top)
     (compile-in g env #f cond)
     (emit g 'brf end)
     (emit g 'pop)
+    (bcode:stack g -1)
     (compile-in g env #f body)
     (emit g 'jmp top)
     (mark-label g end)))
@@ -303,9 +318,12 @@
 (define (compile-for g env lo hi func)
   (if (1arg-lambda? func)
       (begin (compile-in g env #f lo)
+             (bcode:stack g 1)
              (compile-in g env #f hi)
+             (bcode:stack g 1)
              (compile-in g env #f func)
-             (emit g 'for))
+             (emit g 'for)
+             (bcode:stack g -2))
       (error "for: third form must be a 1-argument lambda")))
 
 (define (compile-short-circuit g env tail? forms default branch)
@@ -314,8 +332,10 @@
         (else
          (let ((end  (make-label g)))
            (compile-in g env #f (car forms))
+           (bcode:stack g 1)
            (emit g 'dup)
            (emit g branch end)
+           (bcode:stack g -1)
            (emit g 'pop)
            (compile-short-circuit g env tail? (cdr forms) default branch)
            (mark-label g end)))))
@@ -329,7 +349,8 @@
 
 (define (compile-arglist g env lst)
   (for-each (λ (a)
-              (compile-in g env #f a))
+              (compile-in g env #f a)
+              (bcode:stack g 1))
             lst)
   (length lst))
 
@@ -383,6 +404,33 @@
                     (emit g (if tail? 'tapply 'apply) nargs)))
       (else      (emit g b)))))
 
+(define (inlineable? form)
+  (let ((lam (car form)))
+    (and (pair? lam)
+         (is-lambda? (car lam))
+         (list? (cadr lam))
+         (every symbol? (cadr lam))
+         (not (length> (cadr lam) 255))
+         (length= (cadr lam) (length (cdr form))))))
+
+;; compile call to lambda in head position, inlined
+(define (compile-let g env tail? form)
+  (let ((lam  (car form))
+        (args (cdr form))
+        (sp   (bcode:sp g)))
+    (let ((vars (cadr lam))
+          (n    (compile-arglist g env args)))
+      (let ((newvars
+             (vars-to-env vars (complex-bindings (caddr lam) vars) sp)))
+        (box-vars g newvars)
+        (let ((newenv
+               (cons (nconc newvars (car env))
+                     (cdr env))))
+          (compile-in g newenv tail? (caddr lam))
+          (bcode:stack g (- n))
+          (if (and (> n 0) (not tail?))
+              (emit g 'shift n)))))))
+
 (define (compile-app g env tail? x)
   (let ((head  (car x)))
     (let ((head
@@ -394,9 +442,11 @@
                (top-level-value head)
                head)))
       (if (length> (cdr x) 255)
-          ; more than 255 arguments, need long versions of instructions
+          ;; more than 255 arguments, need long versions of instructions
           (begin (compile-in g env #f head)
+                 (bcode:stack g 1)
                  (let ((nargs (compile-arglist g env (cdr x))))
+                   (bcode:stack g (- nargs))
                    (emit g (if tail? 'tcall.l 'call.l) nargs)))
           (let ((b (and (builtin? head)
                         (builtin->instruction head))))
@@ -406,13 +456,19 @@
                      (length= x 2))
                 (begin (compile-in g env #f (cadr x))
                        (emit g 'cadr))
-                (begin
-                  (if (not b)
-                      (compile-in g env #f head))
-                  (let ((nargs (compile-arglist g env (cdr x))))
-                    (if b
-                        (compile-builtin-call g env tail? x head b nargs)
-                        (emit g (if tail? 'tcall 'call) nargs))))))))))
+                (if (and (pair? head) (is-lambda? (car head))
+                         (inlineable? x))
+                    (compile-let g env tail? x)
+                    (begin
+                      (if (not b)
+                          (begin (compile-in g env #f head)
+                                 (bcode:stack g 1)))
+                      (let ((nargs (compile-arglist g env (cdr x))))
+                        (bcode:stack g (- nargs))
+                        (if (not b) (bcode:stack g -1))
+                        (if b
+                            (compile-builtin-call g env tail? x head b nargs)
+                            (emit g (if tail? 'tcall 'call) nargs)))))))))))
 
 ;; lambda, main compilation loop
 
@@ -598,10 +654,10 @@
          (complex-bindings- (lambda:body e)
                             (diff vars (lambda:vars e))
                             #f
-                            #t #;(or (not head) nested)
+                            (or (not head) nested)
                             capt setd))
         (else
-         (cons (complex-bindings- (car e) vars #t nested capt setd)
+         (cons (complex-bindings- (car e) vars (inlineable? e) nested capt setd)
                (map (lambda (x)
                       (complex-bindings- x vars #f nested capt setd))
                     (cdr e))))))
@@ -613,10 +669,13 @@
     (filter (λ (x) (has? capt x))
             (table-keys setd))))
 
+(define (vars-to-env vars cb offs)
+  (map (λ (var i) (vinfo var (not (not (memq var cb))) (+ i offs)))
+       vars (iota (length vars))))
+
 (define (extend-env env vars cb)
-  (cons (map (λ (var i) (vinfo var (not (not (memq var cb))) i))
-             vars (iota (length vars)))
-        env))
+  (cons (vars-to-env vars cb 0)
+         env))
 
 ;; main entry points
 
@@ -639,8 +698,7 @@
         (vars  (lambda:vars f))
         (opta  (filter pair? (cadr f)))
         (last  (lastcdr f)))
-    (let* ((cb (complex-bindings (lambda:body f) vars))
-           (name  (if (null? last) 'lambda last))
+    (let* ((name  (if (null? last) 'λ last))
            (nargs (if (atom? args) 0 (length args)))
            (nreq  (- nargs (length opta)))
            (kwa   (filter keyword-arg? opta)))
@@ -666,14 +724,10 @@
             ((not (null? atail))     (emit g 'vargc nargs))
             ((null? opta)            (emit g 'argc  nargs)))
 
-      (let ((newenv (extend-env env vars cb)))
-        (let loop ((e (car newenv))
-                   (i 0))
-          (if (pair? e)
-              (begin (if (cadr (car e))
-                         (emit g 'box i))
-                     (loop (cdr e) (+ i 1)))))
-
+      (let ((newenv (extend-env env vars (complex-bindings (lambda:body f) vars))))
+        (box-vars g (car newenv))
+        ;; set initial stack pointer
+        (aset! g 4 (+ (length vars) 4))
         ;; compile body and return
         (compile-in g newenv #t (lambda:body f))
         (emit g 'ret)
@@ -737,7 +791,7 @@
                   (set! i (+ i 1)))
 
                  ((loada seta loadc call tcall list + - * / vector
-                   argc vargc loadi8 apply tapply closure box)
+                   argc vargc loadi8 apply tapply closure box shift)
                   (print-inst inst i 1)
                   (princ (number->string (aref code i)))
                   (set! i (+ i 1)))
--- a/flisp.boot
+++ b/flisp.boot
@@ -17,41 +17,36 @@
 	      #fn("8000|0200\x7f2:" #(#.div0))
 	      #fn("6000n201l:" #()) #fn("6000n201m:" #()) 0 #fn("8000|0200\x7f2:" #(#.vector))
 	      #fn("7000n30182p:" #()) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-	      0 0 0 0 0 0 0 0 0 0 0 0 0)
+	      0 0 0 0 0 0 0 0 0 0 0 0 0 0)
 	    *interactive* #f *syntax-environment*
 	    #table(with-input-from #fn("<000|12021e1220e2e1e12315163:" #(#fn(nconc)
   with-bindings *input-stream* #fn(copy-list)))  unless #fn("<000|1200O211Pe4:" #(if
-  begin))  time #fn("6000n1200>1215061:" #(#fn("=000n120021e1e2e122A23242521e10e326e4e3e3:" #(let
-  time-now prog1 princ "Elapsed time: " - " seconds\n"))
-					   #fn(gensym)))  cond #fn("8000|0200>1D61:" #(#fn("7000n1\x8c00200>1_40<A61:" #(#fn("7000n10H340O:20A0>20<61:" #(#fn("9000n10<20Q;I7040<DQ3@00=J500<:210=P:0=J?0220<A<F=51e3:0T23C_07475051513E0260AF>377750515161:280AF>3295061:2:0<210=PA<F=51e4:" #(else
-  begin or => 1arg-lambda? caddr #fn("<000n1200A<e2e1210227374A5151PF<92=51e4e3:" #(let
-  if begin cddr caddr)) caadr #fn(";000n1200A<e2e121072A510e2F<92=51e4e3:" #(let
-  if caddr)) #fn(gensym) if))) cond-clauses->if)))))  do #fn("@000|220182>221501<22230522224052222505265:" #(#fn("A000n520021822212324e125A=51522324e125F51230e18452e153e4e3e2e1230e18352e3:" #(letrec
-  λ if #fn(nconc) begin #fn(copy-list))) #fn(gensym)
-  #fn(map) #.car #.cadr #fn("6000n170051B38071061:0<:" #(cddr caddr))))  with-bindings #fn("=000|1201>121220522123052212405263:" #(#fn("A000n32021e1222382053e1242225015351262027e124A51522027e1242228082535152e3e164:" #(#fn(nconc)
-  let #fn(map) #.list #fn(copy-list) #fn("7000n22001e3:" #(set!))
-  unwind-protect begin #fn("7000n22001e3:" #(set!))))
-  #fn(map) #.car #.cadr #fn("5000n12060:" #(#fn(gensym)))))  let #fn(":000|1\x8c0\x8c12001>2O61:" #(#fn(";000n1\x8c0A<R3E00A<_4AF<<_4FF<=_@30D4200>12122e12324A<52e125F<51532326A<5262:" #(#fn("7000n2A<3B020A<0e2e1A<e3@3001P:" #(letrec))
-  #fn(nconc) λ #fn(map) #fn("5000n10B3500<:0:" #())
-  #fn(copy-list) #fn("5000n10B3500T:7060:" #(void))))))  define-macro #fn(">000|120210<e22223e10=e12415153e3:" #(set-syntax!
+  begin))  time #fn(">000n12050218522e1e2e123024252622e185e327e4e3e3:" #(#fn(gensym)
+  let time-now prog1 princ "Elapsed time: " - " seconds\n"))  cond #fn(":000|0D\x8c5852085>1_485<061:" #(#fn(">000n10H340O:0<85<20Q;I80485<DQ3C085=J6085<:2185=P:85=J@02285<A<0=51e3:85T23C\x98074758551513c07675855151278685<e2e12886217975855151PA<0=51e4e3:2:50278685<e2e1288675855186e2A<0=51e4e3:2885<2185=PA<0=51e4:" #(else
+  begin or => 1arg-lambda? caddr caadr let if cddr #fn(gensym)) cond-clauses->if)))  do #fn("J000|220501<2122052212305221240522587268927882829e12:1=51522829e12:82512887e18;52e153e4e3e2e12887e18:52e3:" #(#fn(gensym)
+  #fn(map) #.car #.cadr #fn("6000n170051B38071061:0<:" #(cddr caddr)) letrec λ
+  if #fn(nconc) begin #fn(copy-list)))  with-bindings #fn("G000|12021052202205220230522425e12026888653e12720288687535129242:e12715152242:e127202;8688535152e3e164:" #(#fn(map)
+  #.car #.cadr #fn("5000n12060:" #(#fn(gensym)))
+  #fn(nconc) let #.list #fn(copy-list) #fn("7000n22001e3:" #(set!))
+  unwind-protect begin #fn("7000n22001e3:" #(set!))))  let #fn(">000|1O0R3B00?641<?041=?1@30D42021e12223052e124151532225052863C0268687e2e186e3@408788P:" #(#fn(nconc)
+  λ #fn(map) #fn("5000n10B3500<:0:" #()) #fn(copy-list)
+  #fn("5000n10B3500T:7060:" #(void)) letrec))  define-macro #fn(">000|120210<e22223e10=e12415153e3:" #(set-syntax!
   quote #fn(nconc) λ #fn(copy-list)))  quasiquote #fn("7000n1700E62:" #(bq-process))  when #fn(";000|1200211POe4:" #(if
   begin))  with-output-to #fn("<000|12021e1220e2e1e12315163:" #(#fn(nconc)
 								with-bindings
 								*output-stream*
-								#fn(copy-list)))  catch #fn("7000n22010>2215061:" #(#fn("?000n120A210e12223240e225260e22728e2e325290e2Fe3e42:0e22;0e2e4e3e3:" #(trycatch
-  λ if and pair? eq? car quote thrown-value cadr caddr raise))
-  #fn(gensym)))  let* #fn("@000|10H3E02021e1qe12215153e1:2021e173051e1e1220=B3H02024e10=e12215153e1@301515375051e2:" #(#fn(nconc)
+								#fn(copy-list)))  catch #fn("@000n220502112286e123242586e2262786e22829e2e3262:86e20e3e42;86e22<86e2e4e3e3:" #(#fn(gensym)
+  trycatch λ if and pair? eq? car quote thrown-value cadr caddr raise))  let* #fn("@000|10H3E02021e1qe12215153e1:2021e173051e1e1220=B3H02024e10=e12215153e1@301515375051e2:" #(#fn(nconc)
   λ #fn(copy-list) caar let* cadar))  letrec #fn(">000|1202021e12223052e122240522515154e1222605262:" #(#fn(nconc)
   λ #fn(map) #.car #fn("8000n12021e12205162:" #(#fn(nconc) set! #fn(copy-list)))
   #fn(copy-list) #fn("5000n17060:" #(void))))  assert #fn(";000n1200D2122230e2e2e2e4:" #(if
-  raise quote assert-failed))  case #fn(":000|12001>2D61:" #(#fn("8000n1\x8c0020_421A0F>3225061:" #(#fn("8000n2120C5020:1J40O:1R3=021072151e3:1H3=023072151e3:1=J>0230721<51e3:74251523=0260271e2e3:280271e2e3:" #(else
+  raise quote assert-failed))  case #fn("A000|1D\x8c68620_4215022870e2e12324e125268687>215252e3:" #(#fn("8000n2120C5020:1J40O:1R3=021072151e3:1H3=023072151e3:1=J>0230721<51e3:74251523=0260271e2e3:280271e2e3:" #(else
   eq? quote-value eqv? every #.symbol? memq quote memv) vals->cond)
-  #fn("<000n1200Ae2e12122e12324F0>2925252e3:" #(let #fn(nconc) cond #fn(map)
-						#fn("7000n1A<F0<520=P:" #())))
-  #fn(gensym)))))  receive #fn("?000|22021q1e32221e10e123825153e3:" #(call-with-values
-  λ #fn(nconc) #fn(copy-list)))  dotimes #fn(":000|1201>10<0T62:" #(#fn("<000n220E211Ke32223e10e1e124A5153e4:" #(for
-  - #fn(nconc) λ #fn(copy-list)))))  unwind-protect #fn("7000n22010>22150215062:" #(#fn("?000n220121qAe3e2e12223F210e1241e1250e2e3e3e31e1e3e3:" #(let
-  λ prog1 trycatch begin raise)) #fn(gensym)))  throw #fn("9000n220212223e201e4e2:" #(raise
+  #fn(gensym) let #fn(nconc) cond #fn(map)
+  #fn("7000n1A<F0<520=P:" #())))  receive #fn("?000|22021q1e32221e10e123825153e3:" #(call-with-values
+  λ #fn(nconc) #fn(copy-list)))  dotimes #fn("A000|10<0T20E2187Ke32223e186e1e12415153e4:" #(for
+  - #fn(nconc) λ #fn(copy-list)))  unwind-protect #fn("A000n220502050218722q1e3e2e1232402286e12587e12686e2e3e3e387e1e3e3:" #(#fn(gensym)
+  let λ prog1 trycatch begin raise))  throw #fn("9000n220212223e201e4e2:" #(raise
   list quote thrown-value)))
 	    1+ #fn("6000n10KM:" #() 1+) 1-
 	    #fn("6000n10K\x80:" #() 1-) 1arg-lambda? #fn("7000n10B;3U04700<51;3J040=B;3B040TB;3:04710TK62:" #(is-lambda?
@@ -58,7 +53,7 @@
   length=) 1arg-lambda?)
 	    <= #fn("6000n210L;IB0470051;380470151S:" #(nan?) <=) >
 	    #fn("6000n210L:" #() >) >= #fn("6000n201L;IB0470051;380470151S:" #(nan?) >=)
-	    Instructions #table(call.l 83  trycatch 77  largc 81  loadg.l 68  box 92  cadr 36  argc 62  setg 71  load0 21  vector? 45  fixnum? 41  loadc0 17  loada0 0  div0 59  keyargs 91  call 5  loada.l 69  brt.l 50  pair? 18  sub2 80  add2 29  loadc.l 70  loadc 9  builtin? 43  set-car! 47  brt 25  ret 10  loadi8 66  tapply 79  loada1 1  boolean? 39  atom? 24  cdr 13  brne.l 85  / 58  loadf 31  equal? 52  apply 54  dup 11  loadt 20  jmp.l 48  null? 38  not 35  = 60  set-cdr! 30  eq? 33  * 57  load1 27  dummy_t 95  bound? 42  brf 3  function? 44  box.l 93  setc.l 75  < 28  brnn.l 86  jmp 16  loadv 2  for 78  lvargc 82  dummy_eof 97  + 55  dummy_f 94  setc 74  brne 19  compare 61  neg 37  loadv.l 67  number? 40  vargc 76  brn 87  brbound 90  vector 63  loadc1 22  setg.l 72  aref 23  brf.l 49  symbol? 34  aset! 64  car 12  cons 32  tcall.l 84  - 56  brn.l 88  optargs 89  nop 46  closure 14  pop 4  eqv? 51  list 53  seta 15  seta.l 73  brnn 26  loadnil 65  loadg 7  loada 8  dummy_nil 96  tcall 6)
+	    Instructions #table(call.l 83  trycatch 77  largc 81  loadg.l 68  box 92  cadr 36  argc 62  setg 71  load0 21  vector? 45  fixnum? 41  loadc0 17  loada0 0  div0 59  keyargs 91  call 5  loada.l 69  brt.l 50  pair? 18  sub2 80  add2 29  loadc.l 70  loadc 9  builtin? 43  set-car! 47  brt 25  ret 10  loadi8 66  tapply 79  loada1 1  shift 94  boolean? 39  atom? 24  cdr 13  brne.l 85  / 58  loadf 31  equal? 52  apply 54  dup 11  loadt 20  jmp.l 48  null? 38  not 35  = 60  set-cdr! 30  eq? 33  * 57  load1 27  dummy_t 96  bound? 42  brf 3  function? 44  box.l 93  setc.l 75  < 28  brnn.l 86  jmp 16  loadv 2  for 78  lvargc 82  dummy_eof 98  + 55  dummy_f 95  setc 74  brne 19  compare 61  neg 37  loadv.l 67  number? 40  vargc 76  brn 87  brbound 90  vector 63  loadc1 22  setg.l 72  aref 23  brf.l 49  symbol? 34  aset! 64  car 12  cons 32  tcall.l 84  - 56  brn.l 88  optargs 89  nop 46  closure 14  pop 4  eqv? 51  list 53  seta 15  seta.l 73  brnn 26  loadnil 65  loadg 7  loada 8  dummy_nil 97  tcall 6)
 	    __init_globals #fn("5000n020w1422w3474w5476w7478w9:" #("/"
 								   *directory-separator*
 								   "\n"
@@ -69,13 +64,9 @@
 								   *input-stream*
 								   *stderr*
 								   *error-stream*) __init_globals)
-	    __rcscript #fn("7000n02021725161:" #(#fn("6000n12005138071061:D:" #(#fn(path-exists?)
-  load)) #fn("7000n1020c35021:022c3?0232425512662:232427512862:" #(unknown ""
-								   plan9 #fn(string)
-								   #fn(os-getenv)
-								   "home" "/lib/flisprc"
-								   "HOME" "/.flisprc"))
-						 *os-name*) __rcscript)
+	    __rcscript #fn(":000n0708421c37022@U08423c3A0242526512752@>0242528512952\x8e12:84513907;8461:D:" #(*os-name*
+  unknown "" plan9 #fn(string) #fn(os-getenv) "home" "/lib/flisprc" "HOME" "/.flisprc"
+  #fn(path-exists?) load) __rcscript)
 	    __script #fn("6000n1200>121}:" #(#fn("6000n070A61:" #(load))
 					     #fn("6000n170051421K61:" #(top-level-exception-handler
   #fn(exit)))) __script)
@@ -86,27 +77,28 @@
 	    argc-error #fn(";000n2702102211Kl37023@402465:" #(error "compile error: "
 							      " expects " " argument."
 							      " arguments.") argc-error)
-	    array? #fn("7000n10];I<04202105161:" #(#fn("6000n10B;38040<20Q:" #(array))
-						   #fn(typeof)) array?)
+	    array? #fn("7000n10];IF042005185B;390485<21Q:" #(#fn(typeof) array) array?)
 	    assoc #fn("7000n21H340O:701510d3501<:7101=62:" #(caar assoc) assoc)
 	    assv #fn("7000n21H340O:701510c3501<:7101=62:" #(caar assv) assv)
 	    bcode:cenv #fn("6000n10r3G:" #() bcode:cenv) bcode:code
 	    #fn("6000n10EG:" #() bcode:code) bcode:ctable #fn("6000n10KG:" #() bcode:ctable)
-	    bcode:indexfor #fn("8000n22010>2710517205162:" #(#fn("9000n2200A52390210A62:220A15341Fr21KMp4:" #(#fn(has?)
-  #fn(get) #fn(put!))) bcode:ctable bcode:nconst) bcode:indexfor)
-	    bcode:nconst #fn("6000n10r2G:" #() bcode:nconst) bq-bracket
-	    #fn(";000n20H3=020710152e2:0<22CR01El380200=P:202324710=1K\x8052e3e2:0<25CS01El390260Te2:202027710T1K\x8052e3e2:0<28CO01El3500T:202029710T1K\x8052e3e2:20710152e2:" #(#.list
+	    bcode:indexfor #fn(";000n2700517105122861523:02386162:2486187534870r287KMp4:" #(bcode:ctable
+  bcode:nconst #fn(has?) #fn(get) #fn(put!)) bcode:indexfor)
+	    bcode:nconst #fn("6000n10r2G:" #() bcode:nconst) bcode:sp
+	    #fn("6000n10r4G:" #() bcode:sp) bcode:stack #fn("8000n20r40r4G1Mp:" #() bcode:stack)
+	    box-vars #fn("9000n2D\x8c68620086>2_486<\x8e1161:" #(#fn("9000n10B3Q00<T3B070A21720<5153@30D4F<0=61:D:" #(emit
+  box caddr))) box-vars)
+	    bq-bracket #fn(";000n20H3=020710152e2:0<22CR01El380200=P:202324710=1K\x8052e3e2:0<25CS01El390260Te2:202027710T1K\x8052e3e2:0<28CO01El3500T:202029710T1K\x8052e3e2:20710152e2:" #(#.list
   bq-process unquote #.cons 'unquote unquote-splicing copy-list 'unquote-splicing
   unquote-nsplicing 'unquote-nsplicing) bq-bracket)
 	    bq-bracket1 #fn(":000n20B;38040<20Q3K01El3500T:2122730=1K\x8052e3:730162:" #(unquote
   #.cons 'unquote bq-process) bq-bracket1)
-	    bq-process #fn(":000n20R380200e2:0]3A021727305115261:0H3400:0<24CB02526720T1KM52e3:0<27CW01El;3:04780r2523500T:292:720=1K\x8052e3:7;7<052II02=1>17>0512?2@1>105262:2A1>1D510q62:" #(quote
-  #fn("7000n10<20C80210=P:22210e3:" #(#.list #.vector #.apply)) bq-process
-  vector->list quasiquote #.list 'quasiquote unquote length= #.cons 'unquote
-  any splice-form? #fn("9000n20J70201P:1=J?0211<720A52e3:23241P720A52e162:" #(#.list
-  #.cons bq-process #fn(nconc) #fn(list*))) lastcdr #fn(map)
-  #fn("7000n1700A62:" #(bq-bracket1)) #fn("8000n1\x8c0020A0>2_40<:" #(#fn("=000n20J;02071151P:0B3n00<22CW020731AEl3700=@C02425e2760=AK\x8052e252P:F<0=770<A521P62:2071760A521P51P:" #(nconc
-  reverse! unquote nreconc #.list 'unquote bq-process bq-bracket))))) bq-process)
+	    bq-process #fn("<000n20R380200e2:0]3T0717205115286<23C902486=P:252486e3:0H3400:0<26CB02327710T1KM52e3:0<28CW01El;3:04790r2523500T:2:2;710=1K\x8052e3:7<7=052It07>0512?2@1>105286J802387P:87=JA02:87<7186152e3:2A2B87P7186152e162:D\x8c6862C186>2_486<\x8e10q62:" #(quote
+  bq-process vector->list #.list #.vector #.apply quasiquote 'quasiquote
+  unquote length= #.cons 'unquote any splice-form? lastcdr #fn(map)
+  #fn("7000n1700A62:" #(bq-bracket1)) #fn(nconc)
+  #fn(list*) #fn("=000n20J;02071151P:0B3n00<22CW020731AEl3700=@C02425e2760=AK\x8052e252P:F<0=770<A521P62:2071760A521P51P:" #(nconc
+  reverse! unquote nreconc #.list 'unquote bq-process bq-bracket))) bq-process)
 	    builtin->instruction #fn("8000n120A0O63:" #(#fn(get)) #(#table(#.cadr cadr  #.aset! aset!  #.+ +  #.- -  #.equal? equal?  #.eq? eq?  #.builtin? builtin?  #.not not  #.pair? pair?  #.aref aref  #.cdr cdr  #./ /  #.div0 div0  #.set-car! set-car!  #.vector vector  #.set-cdr! set-cdr!  #.< <  #.cons cons  #.apply apply  #.eqv? eqv?  #.vector? vector?  #.list list  #.car car  #.bound? bound?  #.function? function?  #.null? null?  #.symbol? symbol?  #.compare compare  #.boolean? boolean?  #.fixnum? fixnum?  #.atom? atom?  #.= =  #.number? number?  #.* *)))
 	    caaaar #fn("5000n10<<<<:" #() caaaar) caaadr
 	    #fn("5000n10T<<:" #() caaadr) caaar #fn("5000n10<<<:" #() caaar)
@@ -117,9 +109,9 @@
 	    cadar #fn("5000n10<T:" #() cadar) caddar
 	    #fn("5000n10<=T:" #() caddar) cadddr #fn("5000n10==T:" #() cadddr)
 	    caddr #2=#fn("5000n10=T:" #() caddr) call-with-values
-	    #fn("7000n220A1>205061:" #(#fn("6000n10B;3704A0<Q380F0=\x7f2:F061:" #())) #(#1=(*values*)))
-	    capture-var! #fn("7000n22001>27105161:" #(#fn("9000n1200AF>371F0E5361:" #(#fn(":000n10;IF0420A51Fr321A92e152p4:" #(#fn(length)
-  #fn(nconc))) index-of)) bcode:cenv) capture-var!)
+	    #fn("7000n205086B;3804A86<Q390186=\x7f2:18661:" #() #(#1=(*values*)))
+	    capture-var! #fn("<000n27005171186E5387;IG042286510r323861e152p4:" #(bcode:cenv
+  index-of #fn(length) #fn(nconc)) capture-var!)
 	    cdaaar #fn("5000n10<<<=:" #() cdaaar) cdaadr
 	    #fn("5000n10T<=:" #() cdaadr) cdaar #fn("5000n10<<=:" #() cdaar)
 	    cdadar #fn("5000n10<T=:" #() cdadar) cdaddr
@@ -134,155 +126,136 @@
 	    closure? #fn("6000n10\\;36040[S:" #() closure?) compile
 	    #fn("8000n170q7105162:" #(compile-f lower-define) compile)
 	    compile-and #fn(";000n470018283D2166:" #(compile-short-circuit brf) compile-and)
-	    compile-app #fn("9000n420830182>483<61:" #(#fn("9000n120AF9293>40R;3W047109252S;3J040Z;3C0422051;390423051[3:023051@30061:" #(#fn(":000n170A=21523O072F92O054423F93>274F92A=5361:25092AF93>50[;38047605161:" #(length>
-  255 compile-in #fn("9000n170AF37021@4022063:" #(emit tcall.l call.l))
-  compile-arglist #fn("<000n1A20Q;3U0471AF52S;3I0422205123d;3;047492r2523G07593FO92T54476932062:0I>07593FOA54@30D427093F9492A>67893F92=5361:" #(cadr
-  in-env? #fn(top-level-value) #.cadr length= compile-in emit #fn("<000n1A3B070F92939495A067:71F9337022@4023063:" #(compile-builtin-call
-  emit tcall call)) compile-arglist)) builtin->instruction)) in-env? #fn(constant?)
-  #fn(top-level-value)))) compile-app)
-	    compile-arglist #fn("8000n3702101>282524228261:" #(for-each #fn("9000n170AFO064:" #(compile-in))
-							       #fn(length)) compile-arglist)
+	    compile-app #fn("E000n483<88R;3Z047088152S;3M0488Z;3E04218851;3:04228851[3;0228851@40887383=24523i07501O89544760K524770183=537608:U5247808237029@402:8:63:89[;39047;8951892<Q;3V047089152S;3I04222<512=d;3;047>83r2523E07501O83T5447802<62:89B;3E047?89<51;39047@83513=07A01828364:8:IE07501O89544760K52@30D4770183=537608;U5248:I<0760r/52@30D48:3C07B018283898:8;67:780823702C@402D8;63:" #(in-env?
+  #fn(constant?) #fn(top-level-value) length> 255 compile-in bcode:stack
+  compile-arglist emit tcall.l call.l builtin->instruction cadr #.cadr length=
+  is-lambda? inlineable? compile-let compile-builtin-call tcall call) compile-app)
+	    compile-arglist #fn("8000n3702101>282524228261:" #(for-each #fn("9000n170AFO054471AK62:" #(compile-in
+  bcode:stack)) #fn(length)) compile-arglist)
 	    compile-begin #fn("9000n483H3?0700182715064:83=H3>070018283<64:7001O83<5447202352474018283=64:" #(compile-in
   void emit pop compile-begin) compile-begin)
-	    compile-builtin-call #fn(":000n720838586082>5217284O5361:" #(#fn(":000n10;3;0470A=052S3;071F052@30D4229293F94>4F61:" #(length=
-  argc-error #fn("9000n1020CI0AEl3:071F2262:71F92A63:023CX0AEl3:071F2462:Ar2l3:071F2562:71F92A63:026Cf0AEl3:07792K62:AKl3:071F2862:Ar2l3:071F2962:71F92A63:02:CI0AEl3:071F2;62:71F92A63:02<CI0AEl3:07792K62:71F92A63:02=CK0AEl3<071F2>2?63:71F92A63:02@CU0Ar2L3;07792r262:71F933702A@402@A63:71F9262:" #(list
-  emit loadnil + load0 add2 - argc-error neg sub2 * load1 / vector loadv #()
-  apply tapply)))) #fn(get) arg-counts) compile-builtin-call)
+	    compile-builtin-call #fn("<000n7207184O538;;3=047283=8;52S3=073858;52@30D4858<24CK086El3:07502662:750858663:8<27C[086El3:07502862:86r2l3:07502962:750858663:8<2:Cj086El3:07385K62:86Kl3:07502;62:86r2l3:07502<62:750858663:8<2=CK086El3:07502>62:750858663:8<2?CK086El3:07385K62:750858663:8<2@CM086El3<07502A2B63:750858663:8<2CCW086r2L3;07385r262:750823702D@402C8663:7508562:" #(#fn(get)
+  arg-counts length= argc-error list emit loadnil + load0 add2 - neg sub2 *
+  load1 / vector loadv #() apply tapply) compile-builtin-call)
 	    compile-f #fn("8000n2702101>22262:" #(call-with-values #fn("7000n070AF62:" #(compile-f-))
 						  #fn("5000n20:" #())) compile-f)
-	    compile-f- #fn("<000n22001>271501T721T517315174251T527215166:" #(#fn("=000n62084082A83F185>87172F51835261:" #(#fn("=000n120AF92939495096>897J7021@409761:" #(#fn("=000n120AF92939495096>897H360E@8021975161:" #(#fn(">000n120AF9209394959697>9021A51\x8061:" #(#fn("?000n120AF092939495969798>:7172A5261:" #(#fn("A000n1A\x87\x9a00JK070F219293J7094@5094U54@m072F7324252426052772805151535152470F29922805193J7094@5094U5547:F95A969255@30D47;942<523H070F93J702=@402>9453@T093\x87>070F2?9453@C0AJ>070F2@9453@30O42AF9798>37B9596995361:" #(emit
-  optargs bcode:indexfor make-perfect-hash-table
-  #fn(map) #.cons #.car iota #fn(length) keyargs emit-optional-arg-inits > 255
-  largc lvargc vargc argc #fn(":000n120A>1D510<E52471A0D72F5154473A2452475267778A515179A5192537:A5162:" #(#fn("8000n1\x8c0020A0>2_40<:" #(#fn("9000n20B3O00<T3=070A21153@30D4F<0=1KM62:D:" #(emit
-  box)))) compile-in lambda:body emit ret values #fn(function) encode-byte-code
-  bcode:code const-to-idx-vec bcode:cenv)) extend-env)) filter keyword-arg?))
-  #fn(length))) #fn(length))) λ)) complex-bindings lambda:body))
-  make-code-emitter lastcdr lambda:vars filter #.pair?) compile-f-)
-	    compile-for #fn("9000n57084513X07101O825447101O835447101O845447202362:742561:" #(1arg-lambda?
-  compile-in emit for error "for: third form must be a 1-argument lambda") compile-for)
-	    compile-if #fn(";000n4200182>3710517105183T728351738351B3;0748351@60755065:" #(#fn(":000n582DC=070AF928364:82OC=070AF928464:70AFO8254471A22053470AF9283544923<071A2352@:071A24153475A052470AF928454475A162:" #(compile-in
-  emit brf ret jmp mark-label)) make-label caddr cdddr cadddr void) compile-if)
-	    compile-in #fn(":000n483R3<0700183D64:83H3\xaf083EC:07102262:83KC:07102362:83DC:07102462:83OC:07102562:83qC:07102662:7783513<0710288363:2983513C07:01822;2<51e164:7102=8363:83<RS;ID0483<Z;I;047>83<1523=07?01828364:2@830182>483<61:" #(compile-sym
+	    compile-f- #fn("O000n270501T711T517215173241T52711518;J7025@408;87H360E@802687518=268:51\x8073778:528:\x87\xa208?JL07886298>88J708=@508=U54@r07:867;2<2=2<2>8?527?268?5151535152478862@8>268?5188J708=@508=U5547A8608:898>55@30D47B8=2C523I0788688J702D@402E8=53@W088\x87?078862F8=53@E08:J?078862G8=53@30O47H0897I7J1518952537K868@<52486r4268951r4Mp47L868@D7J15154478862M5247N2O7P7Q8651517R86518<537S865162:" #(make-code-emitter
+  lastcdr lambda:vars filter #.pair? λ #fn(length) keyword-arg? emit optargs
+  bcode:indexfor make-perfect-hash-table #fn(map) #.cons #.car iota keyargs
+  emit-optional-arg-inits > 255 largc lvargc vargc argc extend-env
+  complex-bindings lambda:body box-vars compile-in ret values #fn(function)
+  encode-byte-code bcode:code const-to-idx-vec bcode:cenv) compile-f-)
+	    compile-for #fn("9000n57084513n07101O82544720K5247101O83544720K5247101O8454473024524720r.62:752661:" #(1arg-lambda?
+  compile-in bcode:stack emit for error "for: third form must be a 1-argument lambda") compile-for)
+	    compile-if #fn("@000n4700517005183T718351728351B3;0738351@6074508:DC=07501828;64:8:OC=07501828<64:7501O8:54476027885347501828;544823<07602852@;076029895347:0885247501828<5447:08962:" #(make-label
+  caddr cdddr cadddr void compile-in emit brf ret jmp mark-label) compile-if)
+	    compile-in #fn("=000n483R3<0700183D64:83H3\xaf083EC:07102262:83KC:07102362:83DC:07102462:83OC:07102562:83qC:07102662:7783513<0710288363:2983513C07:01822;2<51e164:7102=8363:83<RS;ID0483<Z;I;047>83<1523=07?01828364:83<882@CS07A83T513>07:018283T64:7102=83T63:882BC=07C01828364:882DC>07E018283=64:882FC;07G018363:882HCD07I2J183>22K01>262:882LC>07M018283=64:882NC>07O018283=64:882PCE07Q0183T2D7R8351P64:882SCH07T0183T7U83517V835165:882WCE07:01D83T5447102X62:882YCT083TR360O@807Z2[5147\\0183T7U835164:882]Cp07:01O2Hq83Te35447^7U835151360O@807Z2_5147:01O7U83515447102]62:7?01828364:" #(compile-sym
   emit load0 load1 loadt loadf loadnil fits-i8 loadi8 #fn(eof-object?)
-  compile-in #fn(top-level-value) eof-object loadv in-env? compile-app #fn("<000n1020CQ071AT513>072F9293AT64:73F24AT63:025C=076F9293A64:027C>078F9293A=64:029C;07:F92A63:02;CE07<2=92A>22>F92>262:02?C>07@F9293A=64:02AC>07BF9293A=64:02CCD07DF92AT277EA51P64:02FCF07GF92AT7HA517IA5165:02JCE072F92DAT54473F2K62:02LCR0ATR360O@807M2N5147OF92AT7HA5164:02PCo072F92O2;qATe35447Q7HA5151360O@807M2R51472F92O7HA5154473F2P62:7SF9293A64:" #(quote
-  self-evaluating? compile-in emit loadv if compile-if begin compile-begin
-  prog1 compile-prog1 λ call-with-values #fn("7000n070AF62:" #(compile-f-))
+  compile-in #fn(top-level-value) eof-object loadv in-env? compile-app quote
+  self-evaluating? if compile-if begin compile-begin prog1 compile-prog1 λ
+  call-with-values #fn("7000n070AF62:" #(compile-f-))
   #fn("9000n270A2105341\x87K07223AF>2152470A242515163:D:" #(emit loadv for-each
 							    #fn("9000n170AF0O64:" #(compile-sym))
 							    closure #fn(length)))
   and compile-and or compile-or while compile-while cddr for compile-for caddr
   cadddr return ret set! error "set!: second argument must be a symbol"
-  compile-set! trycatch 1arg-lambda? "trycatch: second form must be a 1-argument lambda"
-  compile-app))) compile-in)
+  compile-set! trycatch 1arg-lambda? "trycatch: second form must be a 1-argument lambda") compile-in)
+	    compile-let #fn("A000n483<83=7005188T71018953728;737488518;528:537508=524268=1<521=P7708>827488515447808<U524798<E52;360482S3<07:02;8<63:D:" #(bcode:sp
+  compile-arglist vars-to-env complex-bindings caddr box-vars #fn(nconc)
+  compile-in bcode:stack > emit shift) compile-let)
 	    compile-or #fn(";000n470018283O2166:" #(compile-short-circuit brt) compile-or)
-	    compile-prog1 #fn(":000n37001O82T544718251B3H07201O7182515447302462:D:" #(compile-in
-  cddr compile-begin emit pop) compile-prog1)
-	    compile-set! #fn("9000n420018382>471821E5361:" #(#fn(":000n1020CF071AFO9254472A239363:24AF92930>50<El61:" #(global
-  compile-in emit setg #fn(":000n120A0F9293>57194=5103<07294=51@9073A935262:" #(#fn(":000n203W070AF37021@4022153473A92O9354470A2462:73A92O93544FIA0752627945251@30D470A28163:" #(emit
-  loada loadc compile-in set-car! error #fn(string)
-  "internal error: misallocated var " seta)) vinfo:heap? vinfo:index
-  capture-var!)))) lookup-sym) compile-set!)
-	    compile-short-circuit #fn(";000n683H3=07001828464:83=H3>070018283<64:210183858284>67205161:" #(compile-in
-  #fn(";000n170AFO92<54471A2252471A93053471A2352474AF9492=959356475A062:" #(compile-in
-  emit dup pop compile-short-circuit mark-label)) make-label) compile-short-circuit)
-	    compile-sym #fn("9000n42082083>371821E5361:" #(#fn(":000n1020C^021A51;3<047223A51513?074F2523A5163:74F26A63:0<El3Z074F27780=5153492;3904790=513:074F2:62:D:74F2;7<FA5253492;3904790=513:074F2:62:D:" #(global
-  #fn(constant?) printable? #fn(top-level-value) emit loadv loadg loada
-  vinfo:index vinfo:heap? car loadc capture-var!)) lookup-sym) compile-sym)
+	    compile-prog1 #fn(":000n37001O82T544718251B3W0720K5247301O71825154474025524720r/62:D:" #(compile-in
+  cddr bcode:stack compile-begin emit pop) compile-prog1)
+	    compile-set! #fn("?000n470821E538821CF07201O83544730248263:88<El7588=51893<07688=51@9077082528:3g07308937028@40298;5347:0K5247201O835447:0r/5247302;62:7201O8354489IA07<2=2>825251@30D47302?8;63:" #(lookup-sym
+  global compile-in emit setg vinfo:heap? vinfo:index capture-var! loada loadc
+  bcode:stack set-car! error #fn(string) "internal error: misallocated var "
+  seta) compile-set!)
+	    compile-short-circuit #fn("<000n683H3=07001828464:83=H3>070018283<64:710517001O83<544720K52473024524730858:534720r/5247302552476018283=84855647708:62:" #(compile-in
+  make-label bcode:stack emit dup pop compile-short-circuit mark-label) compile-short-circuit)
+	    compile-sym #fn(";000n470821E538821Cb0228251;3=0473248251513@07502624825163:750278263:88<El3\\0750287988=5153483;3:047:88=513:07502;62:D:7502<7=0825253483;3:047:88=513:07502;62:D:" #(lookup-sym
+  global #fn(constant?) printable? #fn(top-level-value) emit loadv loadg loada
+  vinfo:index vinfo:heap? car loadc capture-var!) compile-sym)
 	    compile-thunk #fn(":000n170q21q72051e362:" #(compile-f λ
 							 lower-define) compile-thunk)
-	    compile-while #fn("9000n420018283>4710517105162:" #(#fn("9000n270AFO715054472A052470AFO9254473A24153473A2552470AFO9354473A26053472A162:" #(compile-in
-  void mark-label emit brf pop jmp)) make-label) compile-while)
-	    complex-bindings #fn("7000n22001>22150215062:" #(#fn(";000n270AFOO0156471220>17315162:" #(complex-bindings-
-  filter #fn("7000n120A062:" #(#fn(has?))) table-keys))
-							     #fn(table)) complex-bindings)
-	    complex-bindings- #fn("=000n61J40O:0R3M083;39042001523;021840D63:D:0H;I80472051340O:0<23Co0200T1523Q021850TD534833>021840TD53@30D@30D474750511O83848566:760<513L074770517817905152OD848566:740<1D838485562:2;1838485>40=52P:" #(#fn(memq)
+	    compile-while #fn(";000n470051700517101O7250544730K524740885247101O82544750268953475027524730r/5247101O8354475028885347408962:" #(make-label
+  compile-in void bcode:stack mark-label emit brf pop jmp) compile-while)
+	    complex-bindings #fn("=000n2205020507101OO8687564722386>174875162:" #(#fn(table)
+  complex-bindings- filter #fn("7000n120A062:" #(#fn(has?))) table-keys) complex-bindings)
+	    complex-bindings- #fn("=000n61J40O:0R3M083;39042001523;021840D63:D:0H;I80472051340O:0<23Co0200T1523Q021850TD534833>021840TD53@30D@30D474750511O83848566:760<513U074770517817905152O82S;I50483848566:740<17:051838485562;2<1838485>40=52P:" #(#fn(memq)
   #fn(put!) quoted? set! complex-bindings- caddr is-lambda? lambda:body diff
-  lambda:vars #fn(map) #fn(";000n1700AOF929366:" #(complex-bindings-))) complex-bindings-)
-	    const-to-idx-vec #fn("8000n1200>121720515161:" #(#fn("8000n170210>172A515240:" #(table-foreach
-  #fn("7000n2A10p:" #()) bcode:ctable)) #fn(vector-alloc) bcode:nconst) const-to-idx-vec)
+  lambda:vars inlineable? #fn(map) #fn(";000n1700AOF929366:" #(complex-bindings-))) complex-bindings-)
+	    const-to-idx-vec #fn("9000n1207105151722385>17405152485:" #(#fn(vector-alloc)
+  bcode:nconst table-foreach #fn("7000n2A10p:" #()) bcode:ctable) const-to-idx-vec)
 	    copy-tree #fn("7000n10H3400:700<51700=51P:" #(copy-tree) copy-tree)
-	    count #fn("7000n22001>2D61:" #(#fn("8000n1\x8c00200>1_40<AFE63:" #(#fn("9000n31J5082:A<01=01<5139082KM@408263:" #() count-)))) count)
-	    delete-duplicates #fn("7000n1700rD523>0210>1225061:0H3400:230<0=62:" #(length>
-  #fn("7000n1200>1D51Aq62:" #(#fn("8000n1\x8c0020A0>2_40<:" #(#fn("8000n20H38070161:21A0<523:0F<0=162:22A0<D534F<0=0<1P62:" #(reverse!
-  #fn(has?) #fn(put!))))))) #fn(table) #fn("7000n270015238071161:071151P:" #(member
-  delete-duplicates))) delete-duplicates)
+	    count #fn("9000n2D\x8c6862086>1_486<01E63:" #(#fn("9000n31J5082:A<01=01<5139082KM@408263:" #() count-)) count)
+	    delete-duplicates #fn(":000n1700rD523O02150D\x8c686228586>2_486<\x8e10q62:0H3400:0<0=73858652390748661:85748651P:" #(length>
+  #fn(table) #fn("8000n20H38070161:21A0<523:0F<0=162:22A0<D534F<0=0<1P62:" #(reverse!
+  #fn(has?) #fn(put!))) member delete-duplicates) delete-duplicates)
 	    diff #fn("8000n20J40q:200<1523:0710=162:0<710=152P:" #(#fn(memq)
 								   diff) diff)
-	    disassemble #fn(">000\x891000.///\x8a1000I60O?14|282JD07001E53471504D:@30D4221>182<230512405163:" #(disassemble
-  newline #fn("9000n3200A821>4DD62:" #(#fn(":000n2\x8c0\x8c1020A>1_4121FA>2_422A109293>5r423935162:" #(#fn("9000n10\\;36040[S3C07021514720OAKM63:73061:" #(princ
-  "\n" disassemble print) print-val) #fn(";000n370A;3P04FEl;3H0471A7215152;3904A182ML37023@4024751r5\x80512602765:" #(princ
+	    disassemble #fn("T000\x891000.///\x8a1000I60O?14|282JD07001E53471504D:@30D482<2205123051DD2487>1?:425187>2?;4r4268851\x8c<D8<<8=L3\x85242728888<>2O79537:8<<r4523907150@30D4E87K\x802;~48<8<<KM_48>2<8?2=523[08;8>8<<r45348:897>888<<52G5148<8<<r4M_@\x1112<8?2?523V08;8>8<<K5348:89888<<GG5148<8<<KM_@\xe212<8?2@523W08;8>8<<K5347A2B888<<G515148<8<<KM_@\xb212<8?2C523\\08;8>8<<r45347A2B7>888<<52515148<8<<r4M_@}12<8?2D523\xb808;8>8<<r88>2EC70r4@30EM5347A2B7>888<<52512F5248<8<<r4M_47A2B7>888<<52515148<8<<r4M_48>2ECY07A2F5147A2B7>888<<52512F5248<8<<r4M_@30D@\xec08?2Gc3^08;8>8<<r45347A2B7>888<<52512F5248<8<<r4M_@\xb802<8?2H523e08;8>8<<r25347A2I7J8<<r,7K888<<52g3515248<8<<r2M_@z02<8?2L523e08;8>8<<r45347A2I7J8<<r,7>888<<52g3515248<8<<r4M_@<08;8>8<<E53\x8e1\x8e1@\xd6-:" #(disassemble
+  newline #fn(function:code) #fn(function:vals)
+  #fn("9000n10\\;36040[S3C07021514720OAKM63:73061:" #(princ "\n" disassemble
+						      print) print-val)
+  #fn(";000n370A;3P04FEl;3H0471A7215152;3904A182ML37023@4024751r5\x80512602765:" #(princ
   >= 1- " >" "  " hex5 ":  " " ") print-inst)
-  #fn(";000n2\x8c0D0<1L3S04200AF929394>62122940>2O735351@\x0a/:" #(#fn("<000n170A<r4523907150@30D4EFK\x8022~4AA<KM_423920A939495>6061:" #(>
-  newline #fn("6000n1702161:" #(princ "\t"))
-  #fn("=000n120021523Y0A<F92<r453493<94729592<52G5149292<r4M_:20023523T0A<F92<K53493<949592<GG5149292<KM_:20024523T0A<F92<K53475269592<G515149292<KM_:20027523Y0A<F92<r45347526729592<52515149292<r4M_:20028523\xb10A<F92<r8F29C70r4@30EM5347526729592<52512:5249292<r4M_47526729592<52515149292<r4M_4F29CW0752:5147526729592<52512:5249292<r4M_:D:02;c3[0A<F92<r45347526729592<52512:5249292<r4M_:2002<523b0A<F92<r2534752=7>92<r,7?9592<52g3515249292<r2M_:2002@523b0A<F92<r4534752=7>92<r,729592<52g3515249292<r4M_:A<F92<E63:" #(#fn(memq)
-  (loadv.l loadg.l setg.l) ref-int32-LE (loadv loadg setg)
+  #fn(length) #fn(table-foldl) #fn("7000n382;I?041AF<GQ;34040:" #())
+  Instructions > #fn("6000n1702161:" #(princ "\t"))
+  #fn(memq) (loadv.l loadg.l setg.l) ref-int32-LE (loadv loadg setg)
   (loada seta loadc call tcall list + - * / vector argc vargc loadi8 apply
-   tapply closure box) princ #fn(number->string)
+   tapply closure box shift) princ #fn(number->string)
   (loada.l seta.l loadc.l largc lvargc call.l tcall.l box.l) (optargs keyargs)
   keyargs " " brbound (jmp brf brt brne brnn brn) "@" hex5 ref-int16-LE (jmp.l
-  brf.l brt.l brne.l brnn.l brn.l))))) #fn(table-foldl)
-								   #fn("7000n382;I?041AF<GQ;34040:" #())
-								   Instructions))
-  #fn(length))))) #fn(function:code) #fn(function:vals)) disassemble)
+  brf.l brt.l brne.l brnn.l brn.l)) disassemble)
 	    div #fn("7000n201k0EL;3C041EL;3404K;I504r/;I404EM:" #() div) emit
-	    #fn("F000|2\x8c1\x8c282<Jd01<20Q;3C040EGB;3:040EG<21Q3;00EG22_@;00E1<0EGPp@\xfe0231<24523C08275082<<52e1_@30D426821>2271<285251429821>2271<2:525141<2;C`082<2<d3>012=_482q_@H082<2>d3>012?_482q_@30O@30D41<2@C`082<2<d3>012A_482q_@H082<2>d3>012B_482q_@30O@30D42C1082>30EGB3900EG<@30q0EG5240:" #(car
-  cdr cadr #fn(memq) (loadv loadg setg) bcode:indexfor #fn("7000n10;3<0470A<<2152370F0T_:D:" #(>
-  255)) #fn(assq) ((loadv loadv.l) (loadg loadg.l) (setg setg.l) (loada loada.l)
-				   (seta seta.l) (box box.l))
-  #fn("7000n10;3<0470A<<2152370F0T_:D:" #(> 255))
-  ((loadc loadc.l)) loada (0) loada0 (1) loada1 loadc loadc0 loadc1 #fn("=000n2A<20Q;3\x9a04021Q;38041T22Q3E0FE92<<2374151PPp@u0021CB0FE92<<251=PPp@_0026CB0FE92<<271=PPp@I0022CB0FE92<<281=PPp@30O;I`04A<25Q;3704022Q3@0FE92<<231=PPp:FE79A<92<P152p:" #(brf
-  not null? brn cddr brt eq? brne brnn nreconc))) emit)
-	    emit-optional-arg-inits #fn(":000n582B3F02008418382>57105161:D:" #(#fn(";000n170A21F53470A22053473A74927593F52q53O76945154470A27F53470A2852479A05247:A9294=93FKM65:" #(emit
-  brbound brt compile-in extend-env list-head cadar seta pop mark-label
-  emit-optional-arg-inits)) make-label) emit-optional-arg-inits)
-	    encode-byte-code #fn("7000n1207105161:" #(#fn("7000n1207105161:" #(#fn(":000n1200>17122051r322051r2ki2M235261:" #(#fn("<000n120A0>221A51E225022502350OO67:" #(#fn("@000n7\x8c1\x8c5\x8c6208421524D1<0L3\x180485A1<G_485<22CO02382A1<KMG24845153411<r2M_@\xe702084752677F3@02885>185<51@5085<525152411<KM_4861<0L390A1<G@30O_42985<2:523`0238324845186<5342084F3707;@407<E5152411<KM_@m085<2=CI020847;86<5152411<KM_@N086<X3F02>84861A85>585<51@30O@E/47?2@84F82>3835242A8461:" #(#fn(io-write)
-  #int32(0) label #fn(put!) #fn(sizeof) byte #fn(get) Instructions #fn("6000n1020C5021:022C5023:024C5025:026C5027:028C5029:02:C502;:A<:" #(jmp
-  jmp.l brt brt.l brf brf.l brne brne.l brnn brnn.l brn brn.l))
-  #fn(memq) (jmp brf brt brne brnn brn) int32 int16 brbound #fn("9000n120021523G022A73F<515249292<KM_:20024523\x83022A73F<515249292<KM_422A739392<G515249292<KM_494<25CK022A739392<G515249292<KM_:D:22A76F<515249292<KM_:" #(#fn(memq)
-  (loadv.l loadg.l setg.l loada.l seta.l largc lvargc call.l tcall.l loadc.l
-   box.l) #fn(io-write) int32 (optargs keyargs) keyargs uint8)) table-foreach
-  #fn(";000n220A052421AF37072@407324921520\x805162:" #(#fn(io-seek)
-						       #fn(io-write) int32
-						       int16 #fn(get)))
-  #fn(iostream->string))) #fn(length) #fn(table)
-  #fn(buffer))) >= #fn(length) 65536)) list->vector)) reverse!) encode-byte-code)
+	    #fn("P000|282Jb0120Q;3C040EGB;3:040EG<21Q3;00EG22_@:00E10EGPp@\xb9123124523A075082<52e1?2@30D4261275287;3<047882<29523:087T?1@30D\x8e142612:5287;3<047882<29523:087T?1@30D\x8e1412;C\\0822<d3=02=?14q?2@F0822>d3=02??14q?2@30O@30D412@C\\0822<d3=02A?14q?2@F0822>d3=02B?14q?2@30O@30D40EGB3900EG<@30q0EG12CQ;3\x9f04872DQ;390488T2EQ3E00E82<2F7G8851PPp@x0872DCB00E82<2H88=PPp@a0872ICB00E82<2J88=PPp@J0872ECB00E82<2K88=PPp@30O;Ia0412HQ;3804872EQ3B00E82<2F88=PPp@?00E7L182P8852p\x8e240:" #(car
+  cdr cadr #fn(memq) (loadv loadg setg) bcode:indexfor #fn(assq)
+  ((loadv loadv.l) (loadg loadg.l) (setg setg.l) (loada loada.l) (seta seta.l)
+		   (box box.l)) > 255 ((loadc loadc.l)) loada (0) loada0 (1)
+  loada1 loadc loadc0 loadc1 brf not null? brn cddr brt eq? brne brnn nreconc) emit)
+	    emit-optional-arg-inits #fn("<000n582B3\x900700517102284534710238953474075176838452q53O7782515447102884534710295247:0895247;0182=8384KM65:D:" #(make-label
+  emit brbound brt compile-in extend-env list-head cadar seta pop mark-label
+  emit-optional-arg-inits) emit-optional-arg-inits)
+	    encode-byte-code #fn("S000n17005171855172238651r3238651r2ki2M2452238651E255025502650OO278<28524D8988L3\xd9148689G?=48=29CP02:8:8689KMG2;8<5153489r2M?9@\xa81278<7<2=7>873\x8308=8D2?C702@@p08D2AC702B@d08D2CC702D@X08D2EC702F@L08D2GC702H@@08D2IC702J@408=\x8e1@408=525152489KM?948988L3:08689G@30O?>42K8=2L523`02:8;2;8<518>534278<873707M@407NE5152489KM?9@\xeb08=2OCH0278<7M8>5152489KM?9@\xce08>X3\xc708=2K8?2P523H0278<7M8>5152489KM?9@\x9f02K8?2Q523\x810278<7M8>5152489KM?94278<7M8689G5152489KM?948=2RCK0278<7M8689G5152489KM?9@30D@E0278<7S8>5152489KM?9\x8e1@30O@\x83.47T2U8<878:>38;5242V8<61:" #(reverse!
+  list->vector >= #fn(length) 65536 #fn(table)
+  #fn(buffer) #fn(io-write) #int32(0) label #fn(put!)
+  #fn(sizeof) byte #fn(get) Instructions jmp jmp.l brt brt.l brf brf.l brne
+  brne.l brnn brnn.l brn brn.l #fn(memq) (jmp brf brt brne brnn brn) int32
+  int16 brbound (loadv.l loadg.l setg.l loada.l seta.l largc lvargc call.l
+		 tcall.l loadc.l box.l) (optargs keyargs) keyargs uint8
+  table-foreach #fn(";000n220A052421AF37072@407324921520\x805162:" #(#fn(io-seek)
+  #fn(io-write) int32 int16 #fn(get))) #fn(iostream->string)) encode-byte-code)
 	    error #fn("9000|020210P61:" #(#fn(raise) error) error) eval
 	    #fn("7000n170710515160:" #(compile-thunk expand) eval) even? #fn("7000n1200K52El:" #(#fn(logand)) even?)
 	    every #fn("7000n21H;ID0401<51;3:047001=62:" #(every) every) expand
-	    #fn("@000n1200>1DDDDDDDDDDD6;:" #(#fn(";000n;\x8c0\x8c1\x8c2\x8c3\x8c4\x8c5\x8c6\x8c7\x8c8\x8c9\x8c:020_41211>1_48222e1_483238:8201>4_484248:84>2_4852585>1_48626848385>3_487278:848385>4_48828838:>2_48929_48:2:8:89868788>5_48:<Aq62:" #(#fn("7000n20Z;I904200152S:" #(#fn(assq)) top?)
+	    #fn("F000n1DDDDDDDDDDD\x8c5\x8c6\x8c7\x8c8\x8c9\x8c:\x8c;\x8c<\x8c=\x8c>\x8c?8520_4862186>1_48722e1_4882385868?87>4_489248?89>2_48:258:>1_48;268:8988>3_48<278?8:8988>4_48=28888?>2_48>29_48?2:8?8>8;8<8=>5_48?<0q62:" #(#fn("7000n20Z;I904200152S:" #(#fn(assq)) top?)
   #fn("8000n10H3400:020d3400:0<B;3;047105122Q3F023A<7405151A<0=5162:0<A<0=51P:" #(((begin))
-  caar begin #fn(append) cdar) splice-begin) *expanded* #fn("9000n20H3400:20AF192>492<211523;093<051@30061:" #(#fn("9000n120A0F92>493<21925261:" #(#fn(":000n1200AF9293>503:071F51@30q61:" #(#fn("9000n120AF9293>4212223052945261:" #(#fn("9000n1\x8c0AI?02021F0>29262:2293F0>323093F>3D51925161:" #(#fn(map)
-  #fn("7000n1A<0F<62:" #()) #fn("9000n120AF920>4061:" #(#fn("8000n1D0B3[04A<70051QI@00F<0<92<52_@90071051_40=?0@\x04/493:" #(caar
-  cdar)))) #fn(":000n1\x8c00200AF92>4_40<:" #(#fn("9000n10H3400:0<B;3;042071051Q3<00<A<0=51P:22F92A0>493<0<F<5261:" #(define
-  caar #fn(":000n1A2021227305152A<52_4F<0P92<93=51P:" #(#fn(nconc)
-							#fn(map) #.list
-							get-defined-vars))))))))
-  #fn(nconc) #fn(map) #.list)) get-defined-vars)) define)) begin) expand-body)
+  caar begin #fn(append) cdar) splice-begin) *expanded* #fn("A000n20H3400:A<201523:0F<051@300A<21152873;0728651@30q2324258852152\x8c987IA024269289>28662:D\x8c:8:278:928993>4_48:<\x8e186518:D8;B3c0493<788;51QIC08;92<8;<89<52_@;08;798;51_48;=?;@\xfb/48::" #(begin
+  define get-defined-vars #fn(nconc) #fn(map) #.list #fn("7000n1A<0F<62:" #())
+  #fn(";000n10H3400:0<B;3;042071051Q3<00<A<0=51P:F<0<92<52922223247585515292<52_493<85PA<0=51P:" #(define
+  caar #fn(nconc) #fn(map) #.list get-defined-vars)) caar cdar) expand-body)
   #fn("9000n20H3400:0<B;37040<=B3F070051A<71051152e2@400<F<0=152P:" #(caar
   cadar) expand-lambda-list) #fn("7000n10H3600e1:0<B3?070051A<0=51P:0<A<0=51P:" #(caar) l-vars)
-  #fn(":000n220AF1>30T710517205192<0T5164:" #(#fn(":000n420A0F821>52122238352925261:" #(#fn(":000n12021e1A<F052e192<930529464:" #(#fn(nconc)
-  λ)) #fn(nconc) #fn(map) #.list)) lastcdr cddr) expand-lambda)
-  #fn(";000n20=V;I6040TH3M070051J400:210TA<72051152e3:23F921>374051750517005193<740515164:" #(cddr
-  define caddr #fn(":000n4201A0F82>52122238352925261:" #(#fn(":000n12021e1AF<92052Pe193<9405263:" #(#fn(nconc)
-  define)) #fn(nconc) #fn(map) #.list)) cdadr caadr) expand-define)
-  #fn("9000n220A0F1>40T61:" #(#fn("<000n120A<71F512223249293>2052935252P:" #(begin
-  cddr #fn(nconc) #fn(map) #fn("9000n10<70A<0TF525150Fe3:" #(compile-thunk))))) expand-let-syntax)
+  #fn("?000n20T7005171051A<0T5122232489521522225e1F<868:52e192<888:528764:" #(lastcdr
+  cddr #fn(nconc) #fn(map) #.list λ) expand-lambda)
+  #fn("?000n20=V;I6040TH3M070051J400:210TA<72051152e3:730517405170051F<730515125262789521522521e18792<868:52Pe193<888:5263:" #(cddr
+  define caddr cdadr caadr #fn(nconc) #fn(map) #.list) expand-define)
+  #fn("=000n20T20A<71051222324F1>2865215252P:" #(begin cddr #fn(nconc)
+						 #fn(map)
+						 #fn("9000n10<70A<0TF525150Fe3:" #(compile-thunk))) expand-let-syntax)
   #fn("5000n20:" #() local-expansion-env)
-  #fn("<000n20H3400:20A0F1929394>70<61:" #(#fn("=000n120AF92930949596>8210935261:" #(#fn(">000n1200AF929394959697>921A93F>361:" #(#fn("=000n1A;3604A=B3J0F<AT92=f293<70A51945262:A;I?0495RS;I60495Z360060:21F9294959697980>872925161:" #(caddr
-  #fn("7000n103>0A<0F=f29262:9320C40F:9321C;094<F9262:9321C;094<F9262:9322C;095<F9262:9323C;096<F9262:9760:" #(quote
-  λ define let-syntax)) macrocall?)) #fn("7000n020AF>2D519261:" #(#fn("9000n1\x8c0020AF0>3_40<:" #(#fn("8000n10H3400:0<H3700<@90A<0<F5292<0=51P:" #())))))))
-  #fn(assq)))) expand-in)))) expand)
-	    expand-define #fn("<000n1200T71051B3:071051@L00TR3;07250e1@=07324750515262:" #(#fn(";000n20R3:02001<e3:200<2122e10=e1231510<54e3:" #(set!
-  #fn(nconc) λ #fn(copy-list))) cddr void error "compile error: invalid syntax "
-  print-to-string) expand-define)
-	    extend-env #fn(":000n3202182>11722315151530P:" #(#fn(map)
-							     #fn("9000n2700210A52SS163:" #(vinfo
-  #fn(memq))) iota #fn(length)) extend-env)
-	    filter #fn("7000n22001>2D61:" #(#fn("8000n120A>1?040AFqe163:" #(#fn("8000n382D1B3Q04A1<513?0821<qPN=?2@30D41=?1@\x0e/4=:" #() filter-)))) filter)
+  #fn("<000n20H3400:0<208615221A10>387;370487=B3I0A<87T0=f2F<72875115262:87;I?0486RS;I60486Z3708860:73051893>0A<890=f2162:8624C400:8625C:092<0162:8625C:092<0162:8626C:093<0162:8627C:094<0162:8860:" #(#fn(assq)
+  #fn(":000n0D\x8c48420AF84>3_484<\x8e19261:" #(#fn("8000n10H3400:0<H3700<@90A<0<F5292<0=51P:" #())))
+  caddr macrocall? quote λ define let-syntax) expand-in)) expand)
+	    expand-define #fn("?000n10T70051B3:070051@L00TR3;07150e1@=07223740515285R3<0258586<e3:2585<2627e185=e128865185<54e3:" #(cddr
+  void error "compile error: invalid syntax " print-to-string set! #fn(nconc)
+  λ #fn(copy-list)) expand-define)
+	    extend-env #fn("8000n370182E530P:" #(vars-to-env) extend-env)
+	    filter #fn("9000n2D200>1?648601qe163:" #(#fn("8000n382D1B3Q04A1<513?0821<qPN=?2@30D41=?1@\x0e/4=:" #() filter-)) filter)
 	    fits-i8 #fn("7000n10Y;3F04700r\xb052;3:04710r\xaf62:" #(>= <=) fits-i8)
 	    foldl #fn("9000n382J401:700082<15282=63:" #(foldl) foldl) foldr
-	    #fn(":000n382J401:082<700182=5362:" #(foldr) foldr) for-each #fn("<000|2\x8c1208210>3D61:" #(#fn("9000n1\x8c00200>1_4AJM0DF<B3C0492F<<514FF<=_@\x1b/@<00<92F<AP524D:" #(#fn("9000n21<B3J002021152f24A<0202215262:D:" #(#fn(map)
-  #.car #.cdr) for-each-n)))) for-each)
+	    #fn(":000n382J401:082<700182=5362:" #(foldr) foldr) for-each #fn(">000|2D\x8c7872087>1_482JI0D1B3@0401<5141=?1@\x1f/@<087<0182P524D:" #(#fn("9000n21<B3J002021152f24A<0202215262:D:" #(#fn(map)
+  #.car #.cdr) for-each-n)) for-each)
 	    get-defined-vars #fn("7000n170A<05161:" #(delete-duplicates) #(#0=(#fn("8000n10H340q:0<20Q;36040=B3d00TR;37040Te1;IS040TB;3E0471051R;3:0471051e1;I404q:0<22C?02324A<0=52\x7f2:q:" #(define
   caadr begin #fn(nconc) #fn(map)) #(#0#)))))
 	    hex5 #fn("8000n170210r@52r52263:" #(string-lpad #fn(number->string)
@@ -290,23 +263,23 @@
 	    identity #fn("5000n10:" #() identity) in-env?
 	    #fn("7000n21B;3F042001<52;I:047101=62:" #(#fn(assq) in-env?) in-env?)
 	    index-of #fn("9000n31J40O:01<C5082:7001=82KM63:" #(index-of) index-of)
-	    io-readall #fn("6000n1200>1215061:" #(#fn("7000n1200A52421A>12205161:" #(#fn(io-copy)
-  #fn("6000n1020d;380421A513702260:0:" #("" #fn(io-eof?)
-					 #fn(eof-object)))
-  #fn(iostream->string))) #fn(buffer)) io-readall)
+	    inlineable? #fn("9000n10<85B;3u047085<51;3i047185T51;3]04722385T52;3O047485T2552S;3@047685T270=5162:" #(is-lambda?
+  list? every #.symbol? length> 255 length= #fn(length)) inlineable?)
+	    io-readall #fn("8000n12050218505242285518623d;3804240513702560:86:" #(#fn(buffer)
+  #fn(io-copy) #fn(iostream->string) "" #fn(io-eof?)
+  #fn(eof-object)) io-readall)
 	    io-readline #fn("7000n12002162:" #(#fn(io-readuntil) #\newline) io-readline)
 	    io-readlines #fn("7000n17071062:" #(read-all-of io-readline) io-readlines)
 	    iota #fn("7000n17071062:" #(map-int identity) iota) is-lambda?
-	    #fn("6000n1020Q;I704020Q:" #(λ) is-lambda?) keyword->symbol #fn("8000n1200513@02122230515161:0:" #(#fn(keyword?)
-  #fn(symbol) #fn(":000n1200E71220515163:" #(#fn(string-sub) 1- #fn(string-length)))
-  #fn(string)) keyword->symbol)
+	    #fn("6000n1020Q;I704020Q:" #(λ) is-lambda?) keyword->symbol #fn("<000n1200513O021220512386E742586515153\x8e161:0:" #(#fn(keyword?)
+  #fn(symbol) #fn(string) #fn(string-sub) 1- #fn(string-length)) keyword->symbol)
 	    keyword-arg? #fn("6000n10B;3904200<61:" #(#fn(keyword?)) keyword-arg?)
-	    lambda-vars #fn("6000n1200>1D61:" #(#fn("9000n1\x8c00200>1_40<AAOO544212273A5162:" #(#fn(":000n40V;I5040R340D:0B;36040<R3T082;I504833<0702112263:A<0=1828364:0B;36040<B3\x890730<r252;390474051R360O@=070250<2615442774051513=0A<0=182D64:833<0702112863:A<0=1D8364:0B3>070290<26164:01C:07021162:7029026164:" #(error
+	    lambda-vars #fn(":000n1D\x8c5852085>1_485<00OO54421227305162:" #(#fn(":000n40V;I5040R340D:0B;36040<R3T082;I504833<0702112263:A<0=1828364:0B;36040<B3\x890730<r252;390474051R360O@=070250<2615442774051513=0A<0=182D64:833<0702112863:A<0=1D8364:0B3>070290<26164:01C:07021162:7029026164:" #(error
   "compile error: invalid argument list "
   ". optional arguments must come after required." length= caar "compile error: invalid optional argument "
   " in list " #fn(keyword?) ". keyword arguments must come last."
   "compile error: invalid formal argument ") check-formals)
-  #fn(map) #fn("6000n10B390700<61:0:" #(keyword->symbol)) to-proper))) lambda-vars)
+  #fn(map) #fn("6000n10B390700<61:0:" #(keyword->symbol)) to-proper) lambda-vars)
 	    lambda:body #fn("6000n170061:" #(caddr) lambda:body) lambda:vars
 	    #fn("6000n1700T61:" #(lambda-vars) lambda:vars) last-pair #fn("6000n10=H3400:700=61:" #(last-pair) last-pair)
 	    lastcdr #fn("6000n10H3400:70051=:" #(last-pair) lastcdr) length=
@@ -317,45 +290,41 @@
 	    list-ref #fn("7000n2700152<:" #(list-tail) list-ref) list-tail
 	    #fn("8000n2701E523400:710=1K\x8062:" #(<= list-tail) list-tail)
 	    list? #fn("6000n10V;I@040B;3904700=61:" #(list?) list?) load
-	    #fn("8000n1200>1210225261:" #(#fn("8000n1200>1210A>2}:" #(#fn("8000n020A>1D51DDD63:" #(#fn("8000n1\x8c0020A0>2_40<:" #(#fn("9000n320A51IB0F<21A5107215163:23A51472161:" #(#fn(io-eof?)
-  #fn(read) load-process #fn(io-close)))))))
-  #fn("8000n120A5142122F0e361:" #(#fn(io-close)
-				  #fn(raise) load-error))))
-					  #fn(file) :read) load)
+	    #fn("9000n120021522285>123850>2}:" #(#fn(file) :read #fn("9000n0D\x8c48420A84>2_484<\x8e1DDD63:" #(#fn("9000n320A51IB0F<21A5107215163:23A51472161:" #(#fn(io-eof?)
+  #fn(read) load-process #fn(io-close)))))
+						 #fn("8000n120A5142122F0e361:" #(#fn(io-close)
+  #fn(raise) load-error))) load)
 	    load-process #fn("6000n170061:" #(eval) load-process) lookup-sym
-	    #fn("8000n31J5020:218201>31<61:" #(global #fn("8000n120AF92>321F05261:" #(#fn("9000n10360A0P:70F92=AKM63:" #(lookup-sym))
-  #fn(assq)))) lookup-sym)
-	    lower-define #fn("6000n1200>1D61:" #(#fn(":000n120?04AH;I80471A51340A:A<22C<07374A5161:75A<513J02627e1ATe10A51e178A5164:2973A62:" #(#fn("8000n12071051B3N072051B3=02371051P@7074051@60755061:" #(#fn("8000n120710517205162:" #(#fn("8000n20J401:2001e32122052P:" #(λ
-  #fn(map) #fn("5000n17060:" #(void)))) get-defined-vars lower-define)) cddr
-  cdddr begin caddr void) λ-body) quoted? define lower-define expand-define
-  is-lambda? #fn(nconc) λ lastcdr #fn(map)))) lower-define)
+	    #fn(";000n31J5020:1<2108752883808288P:7201=82KM63:" #(global #fn(assq)
+								  lookup-sym) lookup-sym)
+	    lower-define #fn(";000n1D20?540H;I804710513400:0<22C<0737405161:750<513K02627e10Te185051e17805164:2973062:" #(#fn("=000n170051B3N071051B3=02270051P@7073051@60745075855176855186J5087:278687e328298652P:" #(cddr
+  cdddr begin caddr void get-defined-vars lower-define λ #fn(map)
+  #fn("5000n17060:" #(void))) λ-body) quoted? define lower-define expand-define
+  is-lambda? #fn(nconc) λ lastcdr #fn(map)) lower-define)
 	    macrocall? #fn("6000n10<R;3904700<61:" #(symbol-syntax) macrocall?)
-	    macroexpand-1 #fn("7000n10H3400:200>17105161:" #(#fn("6000n103800A=\x7f2:A:" #())
-							     macrocall?) macroexpand-1)
-	    make-code-emitter #fn("8000n0q2050Eqo4:" #(#fn(table)) make-code-emitter)
+	    macroexpand-1 #fn("7000n10H3400:7005185390850=\x7f2:0:" #(macrocall?) macroexpand-1)
+	    make-code-emitter #fn("9000n0q2050EqEo5:" #(#fn(table)) make-code-emitter)
 	    make-label #fn("5000n12060:" #(#fn(gensym)) make-label)
-	    make-perfect-hash-table #fn("6000n1200>1D61:" #(#fn("7000n1\x8c0020_4210A>2D5122A5161:" #(#fn("8000n270712205151162:" #(mod0
-  abs #fn(hash)) $hash-keyword) #fn("9000n1\x8c00200AF>3_40<:" #(#fn("9000n120A0F92>421r20i2O5261:" #(#fn("9000n1200AF92>4D519361:" #(#fn(";000n1\x8c0020AF92093>5_40<:" #(#fn(";000n10B3G020AF9209394>67105161:A:" #(#fn(";000n120AF9209394>6r295<09252i261:" #(#fn("8000n1A0G3;0F<92KM61:A093p4A0KM709451p495<94=61:" #(cdar))))
-  caar)))))) #fn(vector-alloc))))) #fn(length)))) make-perfect-hash-table)
-	    make-system-image #fn(":000n120210222324542562:" #(#fn("7000n22001>2717262:" #(#fn("8000n2Dw04Dw1422AF>22301>261:" #(*print-pretty*
-  *print-readably* #fn("7000n120AF>2210>1}0504:" #(#fn("9000n020A>17122F>1732450515251425A61:" #(#fn("<000n1202122230222405253f2A52425A7662:" #(#fn(write)
-  #fn(nconc) #fn(map) #.list #fn(top-level-value)
-  #fn(io-write) *linefeed*)) filter #fn("8000n10Z;3u0420051S;3j0421051[S;IC0422051222105151dS;3I04230A52S;3=04242105151S:" #(#fn(constant?)
+	    make-perfect-hash-table #fn(";000n1D\x8c58520_4D\x8c6862185860>3_486<\x8e12205161:" #(#fn("8000n270712205151162:" #(mod0
+  abs #fn(hash)) $hash-keyword) #fn("=000n120r20i2O52D\x8c68621A085F86>5_486<\x8e19261:" #(#fn(vector-alloc)
+  #fn(":000n10B3p070051r2A<85F52i29286G3;093<FKM61:928685p49286KM71051p494<0=61:92:" #(caar
+  cdar)))) #fn(length)) make-perfect-hash-table)
+	    make-system-image #fn("<000n120021222354247576Dw54Dw64278788>2288685>22989>1}89504:" #(#fn(file)
+  :write :create :truncate (*linefeed* *directory-separator* *argv* that
+				       *print-pretty* *print-width*
+				       *print-readably* *print-level*
+				       *print-length* *os-name*) *print-pretty*
+  *print-readably* #fn("5000n0Aw04Fw1:" #(*print-pretty* *print-readably*))
+  #fn("=000n07021A>1722350515224252627842628845253f2F52429F7:52\x8e142;F61:" #(filter
+  #fn("8000n10Z;3u0420051S;3j0421051[S;IC0422051222105151dS;3I04230A52S;3=04242105151S:" #(#fn(constant?)
   #fn(top-level-value) #fn(string) #fn(memq)
   #fn(iostream?))) simple-sort #fn(environment)
-  #fn(io-close))) #fn("6000n1A50420061:" #(#fn(raise)))))
-  #fn("5000n0Aw04Fw1:" #(*print-pretty* *print-readably*)))) *print-pretty*
-  *print-readably*)) #fn(file) :write :create :truncate (*linefeed*
-							 *directory-separator*
-							 *argv* that
-							 *print-pretty*
-							 *print-width*
-							 *print-readably*
-							 *print-level*
-							 *print-length*
-							 *os-name*)) make-system-image)
+  #fn(write) #fn(nconc) #fn(map) #.list #fn(top-level-value)
+  #fn(io-write) *linefeed* #fn(io-close)))
+  #fn("6000n1A50420061:" #(#fn(raise)))) make-system-image)
 	    map! #fn("8000n21D1B3B04101<51_41=?1@\x1d/4:" #() map!) map-int
-	    #fn("7000n2701E52340q:2110>20E51qPq62:" #(<= #fn("9000n2\x8c110_4KAK\x80201F>2~40:" #(#fn("7000n1A<F051qPN4AA<=_:" #())))) map-int)
+	    #fn(";000n2701E52340q:0E51qPq\x8c78786_4K1K\x8021870>2~486:" #(<=
+  #fn("7000n1A<F051qPN4AA<=_:" #())) map-int)
 	    mark-label #fn("8000n270021163:" #(emit label) mark-label) max
 	    #fn(";000|11J400:70210163:" #(foldl #fn("6000n201L3401:0:" #())) max)
 	    member #fn("7000n21H340O:1<0d3401:7001=62:" #(member) member) memv
@@ -370,31 +339,31 @@
   #fn(io-write) *linefeed*) newline)
 	    nreconc #fn("7000n2701062:" #(reverse!-) nreconc) odd?
 	    #fn("6000n170051S:" #(even?) odd?) positive? #fn("7000n1700E62:" #(>) positive?)
-	    princ #fn("8000|0200>17161:" #(#fn("7000n1Ow0421A>1220>161:" #(*print-readably*
-  #fn("7000n120A>1210>1}0504:" #(#fn("7000n07021A62:" #(for-each #fn(write)))
-				 #fn("6000n1A50420061:" #(#fn(raise)))))
-  #fn("5000n0Aw0:" #(*print-readably*)))) *print-readably*) princ)
+	    princ #fn(";000|070Ow042185>1220>12386>1}86504:" #(*print-readably*
+							       #fn("5000n0Aw0:" #(*print-readably*))
+							       #fn("7000n07021A62:" #(for-each
+  #fn(write))) #fn("6000n1A50420061:" #(#fn(raise)))) princ)
 	    print #fn("9000|07021062:" #(for-each #fn(write)) print)
-	    print-exception #fn("<000n10B;3D040<20Q;3:04710r3523I072230T24534757605151@\x0600B;3D040<27Q;3:04710r3523I072287605129534750T51@\xd400B;3D040<2:Q;3:04710r2523?0722;0T2<53@\xac00B;38040<2=Q3B0722>514720=f2@\x8d00B;38040<2?Q3G07@76051514722A0T52@i07B051;3:04710r2523I0750<514722C5142D0T51@>0722E514750514727F61:" #(type-error
+	    print-exception #fn("=000n10B;3D040<20Q;3:04710r3523I072230T24534757605151@ 00B;3D040<27Q;3:04710r3523I072287605129534750T51@\xee00B;3D040<2:Q;3:04710r2523?0722;0T2<53@\xc600B;38040<2=Q3B0722>514720=f2@\xa700B;38040<2?Q3G07@76051514722A0T52@\x8307B051;3:04710r2523c0750<514722C5140T2D8551;I60485R37072@40758551\x8e1@>0722E514750514727F61:" #(type-error
   length= princ "type error: expected " ", got " print caddr bounds-error "index "
   " out of bounds for " unbound-error "eval: variable " " has no value" error
-  "error: " load-error print-exception "in file " list? ": " #fn("7000n120051;I5040R37071@4072061:" #(#fn(string?)
-  princ print)) "*** Unhandled exception: " *linefeed*) print-exception)
-	    print-stack-trace #fn("7000n1200>1DD62:" #(#fn("=000n2\x8c0\x8c10200>1_41210>1_4221>17374Ar3523F075A76370r5@40r452@30A517778292:2;505252E63:" #(#fn("8000n32001A>32105182P61:" #(#fn("8000n120A5120F51C>02122230e361:2492F0>325A5161:" #(#fn(function:code)
-  #fn(raise) thrown-value ffound #fn(";000n1E702105151220AF92>4~:" #(1- #fn(length)
-  #fn("8000n170A0G513>0F<A0G929363:D:" #(closure?))))
-  #fn(function:vals))) #fn(function:name)) find-in-f)
-  #fn("9000n22021A01>322}61:" #(#fn(":000n103H0207122237405152255261:26:" #(#fn(symbol)
-  string-join #fn(map) #fn(string) reverse! "/" λ))
-				#fn("8000n07021AF>292524O:" #(for-each #fn("8000n1A<0Fq63:" #())))
-				#fn("6000n10B;3B040<20Q;38040T21Q38072061:23061:" #(thrown-value
-  ffound caddr #fn(raise)))) fn-name) #fn("9000n3\x8c27021A182>3062:" #(for-each
-  #fn("8000n170A<0KGF5271051==P5147250492<El3?0730KG0EG52@30O49292<KM_:" #(print
-  vector->list newline disassemble)))) reverse! length> list-tail *interactive*
-  filter closure? #fn(map) #fn("6000n10Z;380420061:" #(#fn(top-level-value)))
-  #fn(environment)))) print-stack-trace)
-	    print-to-string #fn("6000n1200>1215061:" #(#fn("7000n120A052421061:" #(#fn(write)
-  #fn(iostream->string))) #fn(buffer)) print-to-string)
+  "error: " load-error print-exception "in file " list? ": " #fn(string?)
+  "*** Unhandled exception: " *linefeed*) print-exception)
+	    print-stack-trace #fn("@000n1DD\x8c5\x8c6852085>1_4862185>1_472730r3523F074075370r5@40r452@30051767728292:505252E\x8c97;2<868889>38762:" #(#fn("=000n32005182P2105121151C?022232487e361:25051E76278851512888A187>4~:" #(#fn(function:name)
+  #fn(function:code) #fn(raise) thrown-value ffound #fn(function:vals) 1- #fn(length)
+  #fn("8000n170A0G513>0F<A0G929363:D:" #(closure?))) find-in-f)
+  #fn(";000n220A01>321}863I02273242576865152275261:28:" #(#fn("8000n07021AF>292524O:" #(for-each
+  #fn("8000n1A<0Fq63:" #()))) #fn("6000n10B;3B040<20Q;38040T21Q38072061:23061:" #(thrown-value
+  ffound caddr #fn(raise))) #fn(symbol) string-join #fn(map)
+							  #fn(string) reverse!
+							  "/" λ) fn-name)
+  reverse! length> list-tail *interactive* filter closure? #fn(map)
+  #fn("6000n10Z;380420061:" #(#fn(top-level-value)))
+  #fn(environment) for-each #fn("8000n170A<0KGF5271051==P5147250492<El3?0730KG0EG52@30O49292<KM_:" #(print
+  vector->list newline disassemble))) print-stack-trace)
+	    print-to-string #fn("8000n1205021085524228561:" #(#fn(buffer)
+							      #fn(write)
+							      #fn(iostream->string)) print-to-string)
 	    printable? #fn("6000n120051;I80421051S:" #(#fn(iostream?)
 						       #fn(eof-object?)) printable?)
 	    quote-value #fn("6000n1700513400:210e2:" #(self-evaluating? quote) quote-value)
@@ -402,19 +371,18 @@
 	    #fn("7000n1200513<0712250062:23500i2:" #(#fn(integer?) mod #fn(rand)
 						     #fn(rand-double)) random)
 	    read-all #fn("7000n17021062:" #(read-all-of #fn(read)) read-all)
-	    read-all-of #fn("8000n22010>2D51q015162:" #(#fn("9000n1\x8c0020A0F>3_40<:" #(#fn("8000n220A5138071061:F<10P92A5162:" #(#fn(io-eof?)
-  reverse!))))) read-all-of)
+	    read-all-of #fn(":000n2D\x8c686201860>3_486<\x8e1q015162:" #(#fn("8000n220A5138071061:F<10P92A5162:" #(#fn(io-eof?)
+  reverse!))) read-all-of)
 	    ref-int16-LE #fn(":000n2702101EMGE522101KMGr852M61:" #(int16 #fn(ash)) ref-int16-LE)
 	    ref-int32-LE #fn("<000n2702101EMGE522101KMGr8522101r2MGr@522101r3MGrH52g461:" #(int32
   #fn(ash)) ref-int32-LE)
-	    repl #fn("7000n020DD62:" #(#fn("8000n2\x8c0\x8c1020_412101>2_41<5047260:" #(#fn("7000n070215142273514242526}61:" #(princ
-  "> " #fn(io-flush) *output-stream* #fn("7000n1207151S;3<04227305161:" #(#fn(io-eof?)
-  *input-stream* #fn("6000n17005140w14D:" #(print that)) load-process))
-  #fn("5000n02060:" #(#fn(read))) #fn("6000n1207151422061:" #(#fn(io-discardbuffer)
-							      *input-stream* #fn(raise)))) prompt)
+	    repl #fn(":000n0DD\x8c4\x8c58420_485218485>2_485<5047260:" #(#fn("8000n0702151422735142425}267751S;3F04788451798551485w:4D:" #(princ
+  "> " #fn(io-flush) *output-stream* #fn("5000n02060:" #(#fn(read)))
+  #fn("6000n1207151422061:" #(#fn(io-discardbuffer) *input-stream* #fn(raise)))
+  #fn(io-eof?) *input-stream* load-process print that) prompt)
   #fn("6000n020A>121}3<072504F<60:O:" #(#fn("6000n0A<50;37047060:" #(newline))
 					#fn("6000n1700514D:" #(top-level-exception-handler))
-					newline) reploop) newline))) repl)
+					newline) reploop) newline) repl)
 	    revappend #fn("7000n2701062:" #(reverse-) revappend) reverse
 	    #fn("7000n170q062:" #(reverse-) reverse) reverse! #fn("7000n170q062:" #(reverse!-) reverse!)
 	    reverse!- #fn("8000n2D1B3B041=101?04N4?1@\x1d/40:" #() reverse!-)
@@ -421,41 +389,40 @@
 	    reverse- #fn("7000n21J400:701<0P1=62:" #(reverse-) reverse-)
 	    self-evaluating? #fn("7000n10H;36040RS;IK0420051;3A040R;3:04021051Q:" #(#fn(constant?)
   #fn(top-level-value)) self-evaluating?)
-	    separate #fn("7000n22001>2D61:" #(#fn("9000n120?040AFqe1qe164:" #(#fn(":000n4208283PD1B3Z0401<513?0821<qPN=?2@<0831<qPN=?341=?1@\x05/461:" #(#fn("7000n1700<=0==62:" #(values))) separate-)))) separate)
+	    separate #fn(":000n2D20?648601qe1qe164:" #(#fn("9000n48283PD1B3Z0401<513?0821<qPN=?2@<0831<qPN=?341=?1@\x05/47088<=88==62:" #(values) separate-)) separate)
 	    set-syntax! #fn("8000n220710163:" #(#fn(put!)
 						*syntax-environment*) set-syntax!)
-	    simple-sort #fn("6000n10V;I6040=V3400:200>10<61:" #(#fn("8000n170210A>2220>162:" #(call-with-values
+	    simple-sort #fn("9000n10V;I6040=V3400:0<7021850>22285>162:" #(call-with-values
   #fn("7000n07021A>1F=62:" #(separate #fn("6000n10AL:" #())))
-  #fn("9000n22071051Ae17115163:" #(#fn(nconc) simple-sort))))) simple-sort)
+  #fn("9000n22071051Ae17115163:" #(#fn(nconc) simple-sort))) simple-sort)
 	    splice-form? #fn("7000n10B;3X040<20Q;IN040<21Q;ID040<22Q;3:04730r252;I704022Q:" #(unquote-splicing
   unquote-nsplicing unquote length>) splice-form?)
-	    string-join #fn("7000n20J5020:2101>2225061:" #("" #fn("8000n1200A<52471220F>2A=52423061:" #(#fn(io-write)
-  for-each #fn("7000n120AF52420A062:" #(#fn(io-write)))
-  #fn(iostream->string))) #fn(buffer)) string-join)
+	    string-join #fn("9000n20J5020:215022860<5247324861>20=524258661:" #(""
+  #fn(buffer) #fn(io-write) for-each #fn("7000n120AF52420A062:" #(#fn(io-write)))
+  #fn(iostream->string)) string-join)
 	    string-lpad #fn(":000n3207182122051\x8052062:" #(#fn(string)
 							     string-rep #fn(string-length)) string-lpad)
-	    string-map #fn("8000n22001>221502215162:" #(#fn("9000n22010AF>4E51421061:" #(#fn(":000n1D0AL3N0420F9221930525152472051?0@\x10/:" #(#fn(io-putc)
-  #fn(string-char) 1+)) #fn(iostream->string)))
-							#fn(buffer)
-							#fn(string-length)) string-map)
+	    string-map #fn("=000n2205021151ED8887L3O0422860231885251524748851?8@\x0d/\x8e14258661:" #(#fn(buffer)
+  #fn(string-length) #fn(io-putc) #fn(string-char) 1+ #fn(iostream->string)) string-map)
 	    string-rep #fn(":000n21r4L3`0701E5235021:1Kl38022061:1r2l390220062:2200063:731513@02207401K\x805262:742200521r2j262:" #(<=
   "" #fn(string) odd? string-rep) string-rep)
 	    string-rpad #fn(";000n32007182122051\x805262:" #(#fn(string)
 							     string-rep #fn(string-length)) string-rpad)
 	    string-tail #fn("7000n2200162:" #(#fn(string-sub)) string-tail)
-	    string-trim #fn("8000n3200182>3DD62:" #(#fn(":000n2\x8c0\x8c10200>1_41211>1_422A0F192>523A5161:" #(#fn("9000n48283L;3?042012108252523A0A<017282518364:82:" #(#fn(string-find)
+	    string-trim #fn(">000n3DD\x8c7\x8c8872087>1_4882188>1_42205123087<01E895488<082895363:" #(#fn("9000n48283L;3?042012108252523A0A<017282518364:82:" #(#fn(string-find)
   #fn(string-char) 1+) trim-start) #fn(":000n37082E52;3C0421122073825152523?0A<0173825163:82:" #(>
   #fn(string-find) #fn(string-char) 1-) trim-end)
-  #fn(";000n120AF<A92E05493<A9405363:" #(#fn(string-sub)))
-  #fn(string-length)))) string-trim)
+  #fn(string-length) #fn(string-sub)) string-trim)
 	    symbol-syntax #fn("8000n120710O63:" #(#fn(get)
 						  *syntax-environment*) symbol-syntax)
-	    table-clone #fn("6000n1200>1215061:" #(#fn("8000n120210>1qA5340:" #(#fn(table-foldl)
-  #fn("8000n320A0163:" #(#fn(put!))))) #fn(table)) table-clone)
+	    table-clone #fn("9000n12050212285>1q053485:" #(#fn(table)
+							   #fn(table-foldl)
+							   #fn("8000n320A0163:" #(#fn(put!)))) table-clone)
 	    table-foreach #fn("8000n220210>1q163:" #(#fn(table-foldl)
 						     #fn("7000n3A01524D:" #())) table-foreach)
-	    table-invert #fn("6000n1200>1215061:" #(#fn("8000n120210>1qA5340:" #(#fn(table-foldl)
-  #fn("8000n320A1063:" #(#fn(put!))))) #fn(table)) table-invert)
+	    table-invert #fn("9000n12050212285>1q053485:" #(#fn(table)
+							    #fn(table-foldl)
+							    #fn("8000n320A1063:" #(#fn(put!)))) table-invert)
 	    table-keys #fn("8000n12021q063:" #(#fn(table-foldl)
 					       #fn("6000n3082P:" #())) table-keys)
 	    table-pairs #fn("8000n12021q063:" #(#fn(table-foldl)
@@ -463,23 +430,26 @@
 	    table-values #fn("8000n12021q063:" #(#fn(table-foldl)
 						 #fn("6000n3182P:" #())) table-values)
 	    to-proper #fn("7000n10J400:0H3600e1:0<700=51P:" #(to-proper) to-proper)
-	    top-level-exception-handler #fn("6000n1200>17161:" #(#fn("7000n170w1422A>1230>161:" #(*stderr*
-  *output-stream* #fn("7000n120A>1210>1}0504:" #(#fn("6000n070A51471225061:" #(print-exception
-  print-stack-trace #fn(stacktrace))) #fn("6000n1A50420061:" #(#fn(raise)))))
-  #fn("5000n0Aw0:" #(*output-stream*)))) *output-stream*) top-level-exception-handler)
-	    trace #fn("7000n1200>12105151422:" #(#fn("7000n1200A>2215061:" #(#fn("?000n170A51Ia021F7223024252627Fe20e3e228e12927Ae20e3e4e35162:D:" #(traced?
-  #fn(set-top-level-value!) eval λ begin write cons quote newline apply))
-  #fn(gensym))) #fn(top-level-value) ok) trace)
+	    top-level-exception-handler #fn("9000n17071w042285>1230>12486>1}86504:" #(*output-stream*
+  *stderr* #fn("5000n0Aw0:" #(*output-stream*))
+  #fn("6000n070A51471225061:" #(print-exception print-stack-trace #fn(stacktrace)))
+  #fn("6000n1A50420061:" #(#fn(raise)))) top-level-exception-handler)
+	    trace #fn("A000n1200512150728551Ig0230742586262728290e286e3e22:e12;2985e286e3e4e35152@30D\x8e1\x8e142<:" #(#fn(top-level-value)
+  #fn(gensym) traced? #fn(set-top-level-value!) eval λ begin write cons quote
+  newline apply ok) trace)
 	    traced? #fn("7000n170051;3?042105121A<51d:" #(closure? #fn(function:code)) #((#fn("9000|020210P51472504230\x7f2:" #(#fn(write)
   x newline #.apply)))))
-	    untrace #fn("7000n1200>12105161:" #(#fn("8000n1700513@021A22051r2G62:D:" #(traced?
-  #fn(set-top-level-value!) #fn(function:vals)))
-						#fn(top-level-value)) untrace)
-	    values #fn("8000|00B;36040=V3500<:A0P:" #() #(#1#)) vector->list
-	    #fn("7000n1200>121051q62:" #(#fn(":000n2\x8c1K0201A0>3~41<:" #(#fn("8000n1AF920\x80GA<P_:" #())))
-					 #fn(length)) vector->list)
-	    vector-map #fn("7000n22001>22115161:" #(#fn("8000n1200AF>32105161:" #(#fn(":000n1EAK\x80200F92>3~40:" #(#fn("9000n1A0F920G51p:" #())))
-  #fn(vector-alloc))) #fn(length)) vector-map)
+	    untrace #fn("9000n1200517185513A0220238551r2G62:D:" #(#fn(top-level-value)
+								  traced? #fn(set-top-level-value!)
+								  #fn(function:vals)) untrace)
+	    values #fn("8000|00B;36040=V3500<:A0P:" #() #(#1#)) vars-to-env
+	    #fn(":000n32021182>2072230515163:" #(#fn(map)
+						 #fn("9000n2700210A52SS1FM63:" #(vinfo
+  #fn(memq))) iota #fn(length)) vars-to-env)
+	    vector->list #fn("<000n120051q\x8c6K852186085>3~486<:" #(#fn(length)
+  #fn("8000n1AF920\x80GA<P_:" #())) vector->list)
+	    vector-map #fn("<000n220151218651E86K\x80228701>3~487:" #(#fn(length)
+  #fn(vector-alloc) #fn("9000n1A0F920G51p:" #())) vector-map)
 	    vinfo #fn("7000n30182e3:" #() vinfo) vinfo:heap? #.cadr vinfo:index
 	    #2# vinfo:sym #.car void
 	    #fn("5000n0D:" #() void) zero? #fn("6000n10El:" #() zero?))
--- a/flisp.c
+++ b/flisp.c
@@ -987,6 +987,7 @@
 		GOTO_OP_OFFSET(OP_KEYARGS),
 		GOTO_OP_OFFSET(OP_BOX),
 		GOTO_OP_OFFSET(OP_BOXL),
+		GOTO_OP_OFFSET(OP_SHIFT),
 	};
 	NEXT_OP;
 #else
@@ -1136,6 +1137,12 @@
 			car_(v) = FL(stack)[bp+i];
 			cdr_(v) = FL(Nil);
 			FL(stack)[bp+i] = v;
+			NEXT_OP;
+
+		OP(OP_SHIFT)
+			i = *ip++;
+			FL(stack)[FL(sp)-1-i] = FL(stack)[FL(sp)-1];
+			FL(sp) -= i;
 			NEXT_OP;
 
 		OP(OP_RET)
--- a/gen.lsp
+++ b/gen.lsp
@@ -94,6 +94,7 @@
     OP_KEYARGS        keyargs   #f      0
     OP_BOX            box       #f      0
     OP_BOXL           box.l     #f      0
+    OP_SHIFT          shift     #f      0
     OP_BOOL_CONST_F   dummy_f   #f      0
     OP_BOOL_CONST_T   dummy_t   #f      0
     OP_THE_EMPTY_LIST dummy_nil #f      0
--- a/maxstack.inc
+++ b/maxstack.inc
@@ -38,7 +38,7 @@
 			ip++;
 			break;
 
-		case OP_TCALL: case OP_CALL: case OP_CLOSURE:
+		case OP_TCALL: case OP_CALL: case OP_CLOSURE: case OP_SHIFT:
 			n = *ip++;  // nargs
 			sp -= n;
 			break;
--- a/opcodes.h
+++ b/opcodes.h
@@ -93,6 +93,7 @@
 	OP_KEYARGS,
 	OP_BOX,
 	OP_BOXL,
+	OP_SHIFT,
 	OP_BOOL_CONST_F,
 	OP_BOOL_CONST_T,
 	OP_THE_EMPTY_LIST,