shithub: sl

Download patch

ref: a166a709b349edcb414326a3c1750ec667cf7269
parent: c07007dc7ac255eaed3e1f9da20ba02974d9f950
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Wed Apr 23 13:52:58 EDT 2025

calculate function's max stack size in the compiler

Pass it to "fn" builtin and print out when needed. This renders
"compute_maxstack" C function unused and allows not to run repeated
calculations on every startup.

--- a/boot/sl.boot
+++ b/boot/sl.boot
@@ -1,17 +1,17 @@
-(*builtins* #(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL #fn("n10<:")
-              #fn("n10=:") NIL NIL NIL NIL #fn("n10B:") NIL NIL NIL NIL NIL #fn("n10H:") NIL NIL NIL
-              #fn("z0700}2:" #(<)) NIL #fn("n201N:") NIL #fn("n201P:")
-              #fn("n201Q:") #fn("n10R:") #fn("n10S:")
-              #fn("n10T:") NIL #fn("n10V:") NIL #fn("n10X:")
-              #fn("n10Y:") #fn("n10Z:") #fn("n10[:")
-              #fn("n10\\:") #fn("n10]:") NIL #fn("n201_:") NIL NIL NIL #fn("n201c:")
-              #fn("n201d:") #fn("z00:") #fn("z0700}2:" #(apply))
-              #fn("z0700}2:" #(+)) #fn("z0700}2:" #(-))
-              #fn("z0700}2:" #(*)) #fn("z0700}2:" #(/))
-              #fn("z0700}2:" #(div0)) #fn("z0700}2:" #(=))
-              #fn("n201m:") NIL #fn("z0700}2:" #(vec))
-              #fn("z0700}2:" #(aset!)) NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL #fn("n3012082>1|:" #(#fn("n1A061:")))
-              NIL NIL NIL NIL NIL NIL NIL NIL #fn("z0700}2:" #(aref)) NIL NIL)
+(*builtins* #(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL #fn("n10<:" 5)
+              #fn("n10=:" 5) NIL NIL NIL NIL #fn("n10B:" 5) NIL NIL NIL NIL NIL #fn("n10H:" 5) NIL
+              NIL NIL #fn("z0700}2:" #(<) 6) NIL #fn("n201N:" 6) NIL #fn("n201P:" 6)
+              #fn("n201Q:" 6) #fn("n10R:" 5) #fn("n10S:" 5)
+              #fn("n10T:" 5) NIL #fn("n10V:" 5) NIL #fn("n10X:" 5)
+              #fn("n10Y:" 5) #fn("n10Z:" 5) #fn("n10[:" 5)
+              #fn("n10\\:" 5) #fn("n10]:" 5) NIL #fn("n201_:" 6) NIL NIL NIL #fn("n201c:" 6)
+              #fn("n201d:" 6) #fn("z00:" 4) #fn("z0700}2:" #(apply) 6)
+              #fn("z0700}2:" #(+) 6) #fn("z0700}2:" #(-) 6)
+              #fn("z0700}2:" #(*) 6) #fn("z0700}2:" #(/) 6)
+              #fn("z0700}2:" #(div0) 6) #fn("z0700}2:" #(=) 6)
+              #fn("n201m:" 6) NIL #fn("z0700}2:" #(vec) 6)
+              #fn("z0700}2:" #(aset!) 6) NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL #fn("n3012082>1|:" #(#fn("n1A061:" 6)) 7)
+              NIL NIL NIL NIL NIL NIL NIL NIL #fn("z0700}2:" #(aref) 6) NIL NIL)
             *properties* #table(*formals-list* #table(identity ((x))  bound? ((symbol))  sym-set-doc ((symbol
   doc-seq . formals-list))  io-eof? ((io))  < ((a . rest))  cadr ((cell))  sym (term)  nan? ((v))  for ((min
   max fn))  fixnum? ((v))  exit (((status NIL)))  > ((a . rest))  + (rest)  div0 ((a b))  __finish ((status))  lz-unpack ((data
@@ -50,209 +50,214 @@
 -group . builtin))  buffer ((:doc-group . io))  num? ((:doc-group . builtin))  rand-float ((:doc-group . rand))  builtin? ((:doc-group . builtin))  set-car! ((:doc-group . list)
   (:doc-group . builtin))  cons? ((:doc-group . builtin))  doc-group ((:doc-group . doc))  aref ((:doc-group . builtin))  *properties* ((:doc-group . prop))  vec ((:doc-group . builtin))  >= ((:doc-group . compare))  sym? ((:doc-group . builtin))  zero? ((:doc-group . compare))  length= ((:doc-group . list))  positive? ((:doc-group . compare))  doc-for ((:doc-group . doc))  aset! ((:doc-group . builtin))  T ((:doc-see))  car ((:doc-group . list)
   (:doc-group . builtin))  *builtins* ((:doc-group . builtin))  str ((:doc-group . string))  cons ((:doc-group . list)
-ltin))  zero? ((:doc-group . compare))  length= ((:doc-group . list))  positive? ((:doc-group . compare))  doc-for ((:doc-group . doc))  aset! ((:doc-group . builtin))  T ((:doc-see))  car ((:doc-group . list)
-  (:doc-group . builtin))  *builtins* ((:doc-group . builtin))  str ((:doc-group . string))  cons ((:doc-group . list)
-  (:doc-group . builtin))  - ((:doc-group . builtin))  remprop ((:doc-group . prop))  <= ((:doc-group . compare))  rand ((:doc-group . rand))  negative? ((:doc-group . compare))  Instructions ((:doc-group . builtin))  file ((:doc-group . io))  rand-double ((:doc-group . rand))  cdr ((:doc-group . list)
-  (:doc-group . builtin))  atom? ((:doc-group . builtin))  vec? ((:doc-group . builtin))  / ((:doc-group . builtin))  equal? ((:doc-group . compare)
-  (:doc-group . builtin))  eqv? ((:doc-group . compare) (:doc-group . builtin))  io? ((:doc-group . io))  eof-object? ((:doc-group . io))  list ((:doc-group . builtin))  apply ((:doc-group . builtin))  help ((:doc-group . doc))  rand-u32 ((:doc-group . rand))  = ((:doc-group . compare)
+ltin))  zero? ((:doc-group . compare))  length= ((:doc-group . list))  positive? ((:doc-group . compare))  doc-for ((:doc-group . doc))  aset! ((:doc-group . builtin))  T ((:doc-see))  car ((:doc-group . list)
+  (:doc-group . builtin))  *builtins* ((:doc-group . builtin))  str ((:doc-group . string))  cons ((:doc-group . list)
+  (:doc-group . builtin))  - ((:doc-group . builtin))  remprop ((:doc-group . prop))  <= ((:doc-group . compare))  rand ((:doc-group . rand))  negative? ((:doc-group . compare))  Instructions ((:doc-group . builtin))  file ((:doc-group . io))  rand-double ((:doc-group . rand))  cdr ((:doc-group . list)
+  (:doc-group . builtin))  atom? ((:doc-group . builtin))  vec? ((:doc-group . builtin))  / ((:doc-group . builtin))  equal? ((:doc-group . compare)
+  (:doc-group . builtin))  eqv? ((:doc-group . compare) (:doc-group . builtin))  io? ((:doc-group . io))  eof-object? ((:doc-group . io))  list ((:doc-group . builtin))  apply ((:doc-group . builtin))  help ((:doc-group . doc))  rand-u32 ((:doc-group . rand))  = ((:doc-group . compare)
 al? ((:doc-group . compare)
-roup . builtin))  help ((:doc-group . doc))  rand-u32 ((:doc-group . rand))  = ((:doc-group . compare)
-  (:doc-group . builtin))  rand-u64 ((:doc-group . rand))  not ((:doc-group . builtin))  separate-doc-from-body ((:doc-group . doc))  set-cdr! ((:doc-group . list)
-  (:doc-group . builtin))  fn? ((:doc-group . builtin))  help-print-header ((:doc-group . doc))  lz-pack ((:doc-group . compress))  arg-counts ((:doc-group . builtin))  eq? ((:doc-group . compare)
-  (:doc-group . builtin))  getprop ((:doc-group . prop) (:doc-see . putprop))  vm-stats ((:doc-group . vm))  * ((:doc-group . builtin))  putprop ((:doc-group . prop)
-  (:doc-see . getprop))  io->str ((:doc-group . io))))
-            *syntax-environment* #table(bcode:nconst #fn("n1200r2e3:" #(aref))  doc-for #fn("z10B86;35040<;J404086;35040=70211225251<863I0232487e22489e22488e2e4:232487e22489e2e3:" #(separate-doc-from-body
+oc-group . rand))  = ((:doc-group . compare)
+  (:doc-group . builtin))  rand-u64 ((:doc-group . rand))  not ((:doc-group . builtin))  separate-doc-from-body ((:doc-group . doc))  set-cdr! ((:doc-group . list)
+  (:doc-group . builtin))  fn? ((:doc-group . builtin))  help-print-header ((:doc-group . doc))  lz-pack ((:doc-group . compress))  arg-counts ((:doc-group . builtin))  eq? ((:doc-group . compare)
+  (:doc-group . builtin))  getprop ((:doc-group . prop) (:doc-see . putprop))  vm-stats ((:doc-group . vm))  * ((:doc-group . builtin))  putprop ((:doc-group . prop)
+  (:doc-see . getprop))  io->str ((:doc-group . io))))
+            *syntax-environment* #table(bcode:spmax #fn("n1200r5e3:" #(aref) 7)  bcode:nconst #fn("n1200r2e3:" #(aref) 7)  doc-for #fn("z10B86;35040<;J404086;35040=70211225251<863I0232487e22489e22488e2e4:232487e22489e2e3:" #(separate-doc-from-body
+  #fn(append) (NIL) sym-set-doc quote) 13)  with-input-from #fn("z12021e1220e2e1e17315163:" #(#fn(nconc)
+  with-bindings *io-in* copy-list) 9)  unless #fn("z1200q211Pe4:" #(if begin) 9)  defmacro #fn("z17015186<86=873?0710<870=53@30q42223240<e22526e10=e177885153e3e2:" #(separate-doc-from-body
+  sym-set-doc void set-syntax! quote #fn(nconc) λ copy-list) 15)  time #fn("n1202122e1e2e123024252622e121e32728e5e3e3:" #(let
+  #:g472 time-now prog1 princ "Elapsed time: " - " seconds" *linefeed*) 13)  cond #fn("z0Ib520852185>1_51485<061:" #(#0=#fn("z0I:" #() void 4)
 :85T23C\x94074758551513c07675855151278685<e2e12886217975855151PA<0=51e4e3:272:85<e2e1282:7585512:e2A<0=51e4e3:2885<2185=PA<0=51e4:" #(else
   begin or => 1arg-lambda? caddr caadr let if cddr #:g19) cond-clauses->if)))  do #fn("z21<2071052207205220230522425268827872829e17:1=51522829e17:82512825e18:52e153e4e3e2e12825e18952e3:" #(#fn(map)
   car cadr #fn("n170051B38071061:0<:" #(cddr caddr)) letrec #:g441 λ if #fn(nconc) begin copy-list))  assert-fail #fn("z12021220qe32324e113E0252624e2271<e2e3@30De3e3e2:" #(assert
-51522829e17:82512825e18:52e153e4e3e2e12825e18952e3:" #(#fn(map)
+                                                          begin λ e
 fn("n170051B38071061:0<:" #(cddr caddr)) letrec #:g441 λ if #fn(nconc) begin copy-list))  assert-fail #fn("z12021220qe32324e113E0252624e2271<e2e3@30De3e3e2:" #(assert
-e3@30De3e3e2:" #(assert
-  trycatch begin λ e eq? car quote))  bcode:code #fn("n1200Ee3:" #(aref))  let #fn("z1q0R3B00?641<?041=?1@30q42021e12223052e174151532225052863C0268687e2e186e3@408788P:" #(#fn(nconc)
+                            quote) 13)  bcode:code #fn("n1200Ee3:" #(aref) 7)  let #fn("z1q0R3B00?641<?041=?1@30q42021e12223052e174151532225052863C0268687e2e186e3@408788P:" #(#fn(nconc)
+  λ #fn(map) #fn("n10B3500<:0:" 5) copy-list #fn("n10B3500T:7060:" #(void) 5) letrec) 10)  with-bindings #fn("z12071052207205220230522425e12076888653e17720288687535129242:e17715152242:e177202;8688535152e3e164:" #(#fn(map)
 186e3@408788P:" #(#fn(nconc)
   λ #fn(map) #fn("n10B3500<:0:") copy-list #fn("n10B3500T:7060:" #(void)) letrec))  with-bindings #fn("z12071052207205220230522425e12076888653e17720288687535129242:e17715152242:e177202;8688535152e3e164:" #(#fn(map)
-535152e3e164:" #(#fn(map)
+map)
 01e3:" #(set!))
   unwind-protect begin #fn("n22001e3:" #(set!))))  %defstruct% #fn("O10005000*///z6W1000J7021?14W2000;J60D?24W3000;J60D?34W4000;J60D?44W5000;J60D?54II22230>1??5142224?@514258651262786528@8651268?8652121C60D@C0128C60q@90792:1528E3B082;J904792;51@;082;35048;;36040e185DQ;3:042<02=52;J504858G;3L048F3708G@A08>3;0792>51@30q8E3:02?0e2@7002@e283DQ83;3\\0483H;3M0483DQ;3:042<2A052;J504838CP;J5048384DQ;3:042B02C52;J50484I222D8E108B8F>5?M5142E2Fe18H3{02G8H2He28E3E02I2J2He22K8Ie2e3@V02L2M2N2HEe32K0e2e32O2P2He27Q8A51e3e3e3@30qe18K3C02G8K<8M8K=51e3@30qe18E3U02R2K0e22K2Se28J3808K<@808M8C51e4@30qe17T7U2V8D8B8L8E8H8I8F0>88A525165:" #(#(:constructor
   2 :predicate 4 NIL NIL :type 0 :named 1 :conc-name 3 NIL NIL) vec #0#
-02C52;J50484I222D8E108B8F>5?M5142E2Fe18H3{02G8H2He28E3E02I2J2He22K8Ie2e3@V02L2M2N2HEe32K0e2e32O2P2He27Q8A51e3e3e3@30qe18K3C02G8K<8M8K=51e3@30qe18E3U02R2K0e22K2Se28J3808K<@808M8C51e4@30qe17T7U2V8D8B8L8E8H8I8F0>88A525165:" #(#(:constructor
-  2 :predicate 4 NIL NIL :type 0 :named 1 :conc-name 3 NIL NIL) vec #0#
-  #fn("n10H370q:@30q4207172051f22324850A>38652486:" #((:read-only) assoc-list cddr #fn(for-each)
+8E108B8F>5?M5142E2Fe18H3{02G8H2He28E3E02I2J2He22K8Ie2e3@V02L2M2N2HEe32K0e2e32O2P2He27Q8A51e3e3e3@30qe18K3C02G8K<8M8K=51e3@30qe18E3U02R2K0e22K2Se28J3808K<@808M8C51e4@30qe17T7U2V8D8B8L8E8H8I8F0>88A525165:" #(#(:constructor
+  2 :predicate 4 NIL NIL :type 0 :named 1 :conc-name 3 NIL NIL) vec #0#
+  #fn("n10H370q:@30q4207172051f22324850A>38652486:" #((:read-only) assoc-list cddr #fn(for-each)
 \:))) tokw)
   #fn(length) #fn(map) #fn("n10B3500<:0:") list arg-error "invalid struct type: " "structs of type `vec` are always :named T"
- #fn(sym) #\? "predicate not possible unless the struct is :named T" struct … "make-" #fn(str) "-"
-  #fn("n1200A3Y021Fe12223e2e12292e2e1747526q93535154@f0943S02127e12122e174945152e174935153@@02127e174935152e3:" #(λ
-  #fn(nconc) quote %struct% copy-list foldr #fn("n2202105201PP:" #(#fn(sym) ":")) list) make-constructor)
-  #fn(nconc) begin def s equal? type-of quote and eq? aref = length 1+ putprop constructor
-  copy-list map-int #fn("n170A05270F052923=021928652@4086933<0r20i2KM@30022872324q25e3e3943K0269423e2272895e223e3e3@30q292:25e22;2396360K@30E88Me37<2=85523O02>2?2@2886e22A2897e22Be6e2@G02C2396360K@30E88M24e4e4e4:" #(list-ref
+e not possible unless the struct is :named T" struct … "make-" #fn(str) "-"
+  #fn("n1200A3Y021Fe12223e2e12292e2e1747526q93535154@f0943S02127e12122e174945152e174935153@@02127e174935152e3:" #(λ
+  #fn(nconc) quote %struct% copy-list foldr #fn("n2202105201PP:" #(#fn(sym) ":") 7) list) make-constructor 15)
+  #fn(nconc) begin def s equal? type-of quote and eq? aref = length 1+ putprop constructor
+  copy-list map-int #fn("n170A05270F052923=021928652@4086933<0r20i2KM@30022872324q25e3e3943K0269423e2272895e223e3e3@30q292:25e22;2396360K@30E88Me37<2=85523O02>2?2@2886e22A2897e22Be6e2@G02C2396360K@30E88M24e4e4e4:" #(list-ref
 prop constructor
-052923=021928652@4086933<0r20i2KM@30022872324q25e3e3943K0269423e2272895e223e3e3@30q292:25e22;2396360K@30E88Me37<2=85523O02>2?2@2886e22A2897e22Be6e2@G02C2396360K@30E88M24e4e4e4:" #(list-ref
-  #fn(sym) def s v v-supplied? unless type-error quote if not aref assv :read-only error str "slot "
-  " in struct " " is :read-only" aset!))))  make-label #fn("n120e1:" #(gensym))  bcode:cenv #fn("n1200r3e3:" #(aref))  mark-label #fn("n22002122e21e4:" #(emit
-  quote label))  quasiquote #fn("n1700E62:" #(bq-process))  > #fn("z12021e1721510e163:" #(#fn(nconc)
-  < reverse))  when #fn("z1200211Pqe4:" #(if begin))  help #fn("O100010003000W1000J60q?14W2000J7071?241;3<0422231520P13;02410e3@3007588265275882752IIIIIb;b<288;29_514288<2:_514282;?=514282<87>1?>514282=??51402>CM02?2@8<>18?2A7B26528=5252@$089;J5048:3\xe3082888:2C154475882D527E2F8@527E2G8@52893H07H7I2J898A535147K50@30q48B3W07K5047H2L5147K5042?2M8;>18B5247K50@30q^1^1^1413c07K5047H2N5147K5042?2O8;>18?2A7B26528>525247K50@30q47P50@g07H2Q13<02R12S52@402T05341JE00R3@00ZJ;07H2U51@30q47K5047P60:" #(#(:print-header
-  0) help-print-header #fn(sym) ":doc-" doc getprop *doc* *formals-list* #0#
+0i2KM@30022872324q25e3e3943K0269423e2272895e223e3e3@30q292:25e22;2396360K@30E88Me37<2=85523O02>2?2@2886e22A2897e22Be6e2@G02C2396360K@30E88M24e4e4e4:" #(list-ref
+  #fn(sym) def s v v-supplied? unless type-error quote if not aref assv :read-only error str "slot "
+  " in struct " " is :read-only" aset!) 21)) 33)  make-label #fn("n120e1:" #(gensym) 5)  bcode:cenv #fn("n1200r3e3:" #(aref) 7)  mark-label #fn("n22002122e21e4:" #(emit
+  quote label) 8)  quasiquote #fn("n1700E62:" #(bq-process) 7)  > #fn("z12021e1721510e163:" #(#fn(nconc)
+  < reverse) 8)  when #fn("z1200211Pqe4:" #(if begin) 8)  help #fn("O100010003000W1000J60q?14W2000J7071?241;3<0422231520P13;02410e3@3007588265275882752IIIIIb;b<288;29_514288<2:_514282;?=514282<87>1?>514282=??51402>CM02?2@8<>18?2A7B26528=5252@$089;J5048:3\xe3082888:2C154475882D527E2F8@527E2G8@52893H07H7I2J898A535147K50@30q48B3W07K5047H2L5147K5042?2M8;>18B5247K50@30q^1^1^1413c07K5047H2N5147K5042?2O8;>18?2A7B26528>525247K50@30q47P50@g07H2Q13<02R12S52@402T05341JE00R3@00ZJ;07H2U51@30q47K5047P60:" #(#(:print-header
+  0) help-print-header #fn(sym) ":doc-" doc getprop *doc* *formals-list* #0#
 241;3<0422231520P13;02410e3@3007588265275882752IIIIIb;b<288;29_514288<2:_514282;?=514282<87>1?>514282=??51402>CM02?2@8<>18?2A7B26528=5252@$089;J5048:3\xe3082888:2C154475882D527E2F8@527E2G8@52893H07H7I2J898A535147K50@30q48B3W07K5047H2L5147K5042?2M8;>18B5247K50@30q^1^1^1413c07K5047H2N5147K5042?2O8;>18?2A7B26528>525247K50@30q47P50@g07H2Q13<02R12S52@402T05341JE00R3@00ZJ;07H2U51@30q47K5047P60:" #(#(:print-header
   0) help-print-header #fn(sym) ":doc-" doc getprop *doc* *formals-list* #0#
-5147K50@30q48B3W07K5047H2L5147K5042?2M8;>18B5247K50@30q^1^1^1413c07K5047H2N5147K5042?2O8;>18?2A7B26528>525247K50@30q47P50@g07H2Q13<02R12S52@402T05341JE00R3@00ZJ;07H2U51@30q47K5047P60:" #(#(:print-header
-  0) help-print-header #fn(sym) ":doc-" doc getprop *doc* *formals-list* #0#
-  #fn("n313?02021820>2162:72504738251474061:" #(#fn(for-each)
-                                                #fn("n17050471A51472F0P61:" #(newline princ print))
-                                                newline princ print) print-sig)
-  #fn("n12002152853;0220E8563:0:" #(#fn(str-find) "\n" #fn(str-sub)) first-line)
+K5042?2M8;>18B5247K50@30q^1^1^1413c07K5047H2N5147K5042?2O8;>18?2A7B26528>525247K50@30q47P50@g07H2Q13<02R12S52@402T05341JE00R3@00ZJ;07H2U51@30q47K5047P60:" #(#(:print-header
+  0) help-print-header #fn(sym) ":doc-" doc getprop *doc* *formals-list* #0#
+  #fn("n313?02021820>2162:72504738251474061:" #(#fn(for-each)
+                                                #fn("n17050471A51472F0P61:" #(newline princ print) 7)
+                                                newline princ print) print-sig 7)
+  #fn("n12002152853;0220E8563:0:" #(#fn(str-find) "\n" #fn(str-sub)) first-line 9)
 inc caddr ": " getprop *doc* newline))
-)
-  #fn("n10<20Q:" #(:doc-see)) princ foldl #fn("n20=161:") newline "See also:" #fn("n1A<0=700=21522263:" #(getprop
-  *formals-list* "    ")) "Members:" #fn("n1A<070021522263:" #(getprop *formals-list* "    ")) void
-  "no help for " #fn(str) " " "" " (undefined)"))  defstruct #fn("z0700=5185<85=0<I21228887>2?9514863H0738824862589Pe15252@30q42627e188e178875163:" #(separate-doc-from-body
-  #0# #fn("n12002152853=0220E8553@300853<02208552@402324752627AF5351285229862:7;882<528764:" #(#fn(str-find)
-  "\n\n" #fn(str-sub) "" #fn(str-split) print-to-str #fn(list*) defstruct "\n" #fn(str) "\n\n    "
-  str-join "\n    ") fmt) sym-set-doc #fn(append) :doc-fmt #fn(nconc) %defstruct% copy-list))  bcode:ctable #fn("n1200Ke3:" #(aref))  with-output-to #fn("z12021e1220e2e1e17315163:" #(#fn(nconc)
-  with-bindings *io-out* copy-list))  catch #fn("n22012122e123242522e2262722e22829e2e3262:22e20e3e42;22e22<22e2e4e3e3:" #(trycatch
-  λ #:g464 if and cons? eq? car quote thrown-value cadr caddr raise))  let* #fn("z10H3E02021e1qe17215153e1:2021e173051e1e1720=B3H02024e10=e17215153e1@301515375051e2:" #(#fn(nconc)
-  λ copy-list caar let* cadar))  letrec #fn("z1202021e12273052e122240527515154e1227605262:" #(#fn(nconc)
-  λ #fn(map) car #fn("n12021e17205162:" #(#fn(nconc) set! copy-list)) copy-list void))  bcode:sp #fn("n1200r4e3:" #(aref))  bcode:stack #fn("n2200r421220e21e3e4:" #(aset!
+"n10<20Q:" #(:doc-fmt) 6)
+  #fn("n10<20Q:" #(:doc-see) 6) princ foldl #fn("n20=161:" 6) newline "See also:" #fn("n1A<0=700=21522263:" #(getprop
+  *formals-list* "    ") 9) "Members:" #fn("n1A<070021522263:" #(getprop *formals-list* "    ") 9)
+  void "no help for " #fn(str) " " "" " (undefined)") 21)  defstruct #fn("z0700=5185<85=0<I21228887>2?9514863H0738824862589Pe15252@30q42627e188e178875163:" #(separate-doc-from-body
+  #0# #fn("n12002152853=0220E8553@300853<02208552@402324752627AF5351285229862:7;882<528764:" #(#fn(str-find)
+  "\n\n" #fn(str-sub) "" #fn(str-split) print-to-str #fn(list*) defstruct "\n" #fn(str) "\n\n    "
+  str-join "\n    ") fmt 14) sym-set-doc #fn(append) :doc-fmt #fn(nconc) %defstruct% copy-list) 15)  bcode:ctable #fn("n1200Ke3:" #(aref) 7)  with-output-to #fn("z12021e1220e2e1e17315163:" #(#fn(nconc)
+  with-bindings *io-out* copy-list) 9)  catch #fn("n22012122e123242522e2262722e22829e2e3262:22e20e3e42;22e22<22e2e4e3e3:" #(trycatch
+  λ #:g464 if and cons? eq? car quote thrown-value cadr caddr raise) 15)  let* #fn("z10H3E02021e1qe17215153e1:2021e173051e1e1720=B3H02024e10=e17215153e1@301515375051e2:" #(#fn(nconc)
+  λ copy-list caar let* cadar) 13)  letrec #fn("z1202021e12273052e122240527515154e1227605262:" #(#fn(nconc)
+  λ #fn(map) car #fn("n12021e17205162:" #(#fn(nconc) set! copy-list) 8) copy-list void) 11)  bcode:sp #fn("n1200r4e3:" #(aref) 7)  assert #fn("n1200D2122230e2e2e2e4:" #(if
+  raise quote assert-failed) 11)  case #fn("z1Ib6208621_514225023870e2e12425e126278687>215252e3:" #(#0#
 e1227605262:" #(#fn(nconc)
-0B;3D040<20Q;3:04710TK62:" #(λ length=) 1arg-lambda?)
+ #(λ length=) 1arg-lambda? 7)
 <0L2;J5040V340q:A<1<1=62:")) <=) >
-#(#fn("n21S;JE041<0L2;3;04A<1<1=62:")) >) >= #fn("z1Ib6862086>1_486<^10162:" #(#fn("n21S;JL0401<L2;J5040V340q:A<1<1=62:")) >=)
+3;04A<1<1=62:" 7)) > 7) >=
 (#fn("n21S;JL0401<L2;J5040V340q:A<1<1=62:")) >=)
-oadg.l #u8(68)  aref2 #u8(23)  box #u8(50)  cadr #u8(36)  argc #u8(62)  setg #u8(71)  load0 #u8(21)  nan? #u8(38)  fixnum? #u8(41)  loadc0 #u8(17)  loada0 #u8(0)  div0 #u8(59)  keyargs #u8(31)  call #u8(5)  loada.l #u8(69)  num? #u8(40)  sub2 #u8(78)  add2 #u8(29)  loadc.l #u8(70)  loadc #u8(9)  builtin? #u8(43)  set-car! #u8(47)  vargc.l #u8(80)  vec #u8(63)  ret #u8(10)  loadi8 #u8(66)  tapply #u8(77)  loadvoid #u8(25)  loada1 #u8(1)  shift #u8(46)  atom? #u8(24)  cdr #u8(13)  brne.l #u8(83)  / #u8(58)  equal? #u8(52)  apply #u8(54)  dup #u8(11)  loadt #u8(20)  bounda #u8(39)  jmp.l #u8(48)  = #u8(60)  not #u8(35)  set-cdr! #u8(30)  fn? #u8(44)  eq? #u8(33)  * #u8(57)  load1 #u8(27)  bound? #u8(42)  box.l #u8(86)  < #u8(28)  brnn.l #u8(84)  jmp #u8(16)  loadv #u8(2)  for #u8(76)  + #u8(55)  brne #u8(19)  argc.l #u8(79)  compare #u8(61)  brn #u8(3)  neg #u8(37)  loadv.l #u8(67)  vargc #u8(74)  loadc1 #u8(22)  setg.l #u8(72)  cons? #u8(18)  aref #u8(85)  sym? #u8(34)  aset! #u8(64)  car #u8(12)  cons #u8(32)  tcall.l #u8(82)  - #u8(56)  brn.l #u8(49)  optargs #u8(87)  closure #u8(14)  vec? #u8(45)  pop #u8(4)  eqv? #u8(51)  list #u8(53)  seta #u8(15)  seta.l #u8(73)  brnn #u8(26)  loadnil #u8(65)  loadg #u8(7)  loada #u8(8)  tcall #u8(6))
-            S #fn("z1700215286380861}2:7223062:" #(getprop constructor error "no default constructor for struct: ") S)
-            __finish #fn("n120Z3>021220>17062:q:" #(*exit-hooks* #fn(for-each)
+ #u8(68)  aref2 #u8(23)  box #u8(50)  cadr #u8(36)  argc #u8(62)  setg #u8(71)  load0 #u8(21)  nan? #u8(38)  fixnum? #u8(41)  loadc0 #u8(17)  loada0 #u8(0)  div0 #u8(59)  keyargs #u8(31)  call #u8(5)  loada.l #u8(69)  num? #u8(40)  sub2 #u8(78)  add2 #u8(29)  loadc.l #u8(70)  loadc #u8(9)  builtin? #u8(43)  set-car! #u8(47)  vargc.l #u8(80)  vec #u8(63)  ret #u8(10)  loadi8 #u8(66)  tapply #u8(77)  loadvoid #u8(25)  loada1 #u8(1)  shift #u8(46)  atom? #u8(24)  cdr #u8(13)  brne.l #u8(83)  / #u8(58)  equal? #u8(52)  apply #u8(54)  dup #u8(11)  loadt #u8(20)  bounda #u8(39)  jmp.l #u8(48)  = #u8(60)  not #u8(35)  set-cdr! #u8(30)  fn? #u8(44)  eq? #u8(33)  * #u8(57)  load1 #u8(27)  bound? #u8(42)  box.l #u8(86)  < #u8(28)  brnn.l #u8(84)  jmp #u8(16)  loadv #u8(2)  for #u8(76)  + #u8(55)  brne #u8(19)  argc.l #u8(79)  compare #u8(61)  brn #u8(3)  neg #u8(37)  loadv.l #u8(67)  vargc #u8(74)  loadc1 #u8(22)  setg.l #u8(72)  cons? #u8(18)  aref #u8(85)  sym? #u8(34)  aset! #u8(64)  car #u8(12)  cons #u8(32)  tcall.l #u8(82)  - #u8(56)  brn.l #u8(49)  optargs #u8(87)  closure #u8(14)  vec? #u8(45)  pop #u8(4)  eqv? #u8(51)  list #u8(53)  seta #u8(15)  seta.l #u8(73)  brnn #u8(26)  loadnil #u8(65)  loadg #u8(7)  loada #u8(8)  tcall #u8(6))
+            S #fn("z1700215286380861}2:7223062:" #(getprop constructor error "no default constructor for struct: ") S 8)
+            __finish #fn("n120Z3>021220>17062:q:" #(*exit-hooks* #fn(for-each)
 ub2 #u8(78)  add2 #u8(29)  loadc.l #u8(70)  loadc #u8(9)  builtin? #u8(43)  set-car! #u8(47)  vargc.l #u8(80)  vec #u8(63)  ret #u8(10)  loadi8 #u8(66)  tapply #u8(77)  loadvoid #u8(25)  loada1 #u8(1)  shift #u8(46)  atom? #u8(24)  cdr #u8(13)  brne.l #u8(83)  / #u8(58)  equal? #u8(52)  apply #u8(54)  dup #u8(11)  loadt #u8(20)  bounda #u8(39)  jmp.l #u8(48)  = #u8(60)  not #u8(35)  set-cdr! #u8(30)  fn? #u8(44)  eq? #u8(33)  * #u8(57)  load1 #u8(27)  bound? #u8(42)  box.l #u8(86)  < #u8(28)  brnn.l #u8(84)  jmp #u8(16)  loadv #u8(2)  for #u8(76)  + #u8(55)  brne #u8(19)  argc.l #u8(79)  compare #u8(61)  brn #u8(3)  neg #u8(37)  loadv.l #u8(67)  vargc #u8(74)  loadc1 #u8(22)  setg.l #u8(72)  cons? #u8(18)  aref #u8(85)  sym? #u8(34)  aset! #u8(64)  car #u8(12)  cons #u8(32)  tcall.l #u8(82)  - #u8(56)  brn.l #u8(49)  optargs #u8(87)  closure #u8(14)  vec? #u8(45)  pop #u8(4)  eqv? #u8(51)  list #u8(53)  seta #u8(15)  seta.l #u8(73)  brnn #u8(26)  loadnil #u8(65)  loadg #u8(7)  loada #u8(8)  tcall #u8(6))
             S #fn("z1700215286380861}2:7223062:" #(getprop constructor error "no default constructor for struct: ") S)
-)  equal? #u8(52)  apply #u8(54)  dup #u8(11)  loadt #u8(20)  bounda #u8(39)  jmp.l #u8(48)  = #u8(60)  not #u8(35)  set-cdr! #u8(30)  fn? #u8(44)  eq? #u8(33)  * #u8(57)  load1 #u8(27)  bound? #u8(42)  box.l #u8(86)  < #u8(28)  brnn.l #u8(84)  jmp #u8(16)  loadv #u8(2)  for #u8(76)  + #u8(55)  brne #u8(19)  argc.l #u8(79)  compare #u8(61)  brn #u8(3)  neg #u8(37)  loadv.l #u8(67)  vargc #u8(74)  loadc1 #u8(22)  setg.l #u8(72)  cons? #u8(18)  aref #u8(85)  sym? #u8(34)  aset! #u8(64)  car #u8(12)  cons #u8(32)  tcall.l #u8(82)  - #u8(56)  brn.l #u8(49)  optargs #u8(87)  closure #u8(14)  vec? #u8(45)  pop #u8(4)  eqv? #u8(51)  list #u8(53)  seta #u8(15)  seta.l #u8(73)  brnn #u8(26)  loadnil #u8(65)  loadg #u8(7)  loada #u8(8)  tcall #u8(6))
-            S #fn("z1700215286380861}2:7223062:" #(getprop constructor error "no default constructor for struct: ") S)
+8(52)  apply #u8(54)  dup #u8(11)  loadt #u8(20)  bounda #u8(39)  jmp.l #u8(48)  = #u8(60)  not #u8(35)  set-cdr! #u8(30)  fn? #u8(44)  eq? #u8(33)  * #u8(57)  load1 #u8(27)  bound? #u8(42)  box.l #u8(86)  < #u8(28)  brnn.l #u8(84)  jmp #u8(16)  loadv #u8(2)  for #u8(76)  + #u8(55)  brne #u8(19)  argc.l #u8(79)  compare #u8(61)  brn #u8(3)  neg #u8(37)  loadv.l #u8(67)  vargc #u8(74)  loadc1 #u8(22)  setg.l #u8(72)  cons? #u8(18)  aref #u8(85)  sym? #u8(34)  aset! #u8(64)  car #u8(12)  cons #u8(32)  tcall.l #u8(82)  - #u8(56)  brn.l #u8(49)  optargs #u8(87)  closure #u8(14)  vec? #u8(45)  pop #u8(4)  eqv? #u8(51)  list #u8(53)  seta #u8(15)  seta.l #u8(73)  brnn #u8(26)  loadnil #u8(65)  loadg #u8(7)  loada #u8(8)  tcall #u8(6))
+            S #fn("z1700215286380861}2:7223062:" #(getprop constructor error "no default constructor for struct: ") S 8)
 (44)  eq? #u8(33)  * #u8(57)  load1 #u8(27)  bound? #u8(42)  box.l #u8(86)  < #u8(28)  brnn.l #u8(84)  jmp #u8(16)  loadv #u8(2)  for #u8(76)  + #u8(55)  brne #u8(19)  argc.l #u8(79)  compare #u8(61)  brn #u8(3)  neg #u8(37)  loadv.l #u8(67)  vargc #u8(74)  loadc1 #u8(22)  setg.l #u8(72)  cons? #u8(18)  aref #u8(85)  sym? #u8(34)  aset! #u8(64)  car #u8(12)  cons #u8(32)  tcall.l #u8(82)  - #u8(56)  brn.l #u8(49)  optargs #u8(87)  closure #u8(14)  vec? #u8(45)  pop #u8(4)  eqv? #u8(51)  list #u8(53)  seta #u8(15)  seta.l #u8(73)  brnn #u8(26)  loadnil #u8(65)  loadg #u8(7)  loada #u8(8)  tcall #u8(6))
             S #fn("z1700215286380861}2:7223062:" #(getprop constructor error "no default constructor for struct: ") S)
- #u8(79)  compare #u8(61)  brn #u8(3)  neg #u8(37)  loadv.l #u8(67)  vargc #u8(74)  loadc1 #u8(22)  setg.l #u8(72)  cons? #u8(18)  aref #u8(85)  sym? #u8(34)  aset! #u8(64)  car #u8(12)  cons #u8(32)  tcall.l #u8(82)  - #u8(56)  brn.l #u8(49)  optargs #u8(87)  closure #u8(14)  vec? #u8(45)  pop #u8(4)  eqv? #u8(51)  list #u8(53)  seta #u8(15)  seta.l #u8(73)  brnn #u8(26)  loadnil #u8(65)  loadg #u8(7)  loada #u8(8)  tcall #u8(6))
+ #u8(61)  brn #u8(3)  neg #u8(37)  loadv.l #u8(67)  vargc #u8(74)  loadc1 #u8(22)  setg.l #u8(72)  cons? #u8(18)  aref #u8(85)  sym? #u8(34)  aset! #u8(64)  car #u8(12)  cons #u8(32)  tcall.l #u8(82)  - #u8(56)  brn.l #u8(49)  optargs #u8(87)  closure #u8(14)  vec? #u8(45)  pop #u8(4)  eqv? #u8(51)  list #u8(53)  seta #u8(15)  seta.l #u8(73)  brnn #u8(26)  loadnil #u8(65)  loadg #u8(7)  loada #u8(8)  tcall #u8(6))
  #u8(22)  setg.l #u8(72)  cons? #u8(18)  aref #u8(85)  sym? #u8(34)  aset! #u8(64)  car #u8(12)  cons #u8(32)  tcall.l #u8(82)  - #u8(56)  brn.l #u8(49)  optargs #u8(87)  closure #u8(14)  vec? #u8(45)  pop #u8(4)  eqv? #u8(51)  list #u8(53)  seta #u8(15)  seta.l #u8(73)  brnn #u8(26)  loadnil #u8(65)  loadg #u8(7)  loada #u8(8)  tcall #u8(6))
-2)  tcall.l #u8(82)  - #u8(56)  brn.l #u8(49)  optargs #u8(87)  closure #u8(14)  vec? #u8(45)  pop #u8(4)  eqv? #u8(51)  list #u8(53)  seta #u8(15)  seta.l #u8(73)  brnn #u8(26)  loadnil #u8(65)  loadg #u8(7)  loada #u8(8)  tcall #u8(6))
-            S #fn("z1700215286380861}2:7223062:" #(getprop constructor error "no default constructor for struct: ") S)
-            __finish #fn("n120Z3>021220>17062:q:" #(*exit-hooks* #fn(for-each)
+- #u8(56)  brn.l #u8(49)  optargs #u8(87)  closure #u8(14)  vec? #u8(45)  pop #u8(4)  eqv? #u8(51)  list #u8(53)  seta #u8(15)  seta.l #u8(73)  brnn #u8(26)  loadnil #u8(65)  loadg #u8(7)  loada #u8(8)  tcall #u8(6))
+            S #fn("z1700215286380861}2:7223062:" #(getprop constructor error "no default constructor for struct: ") S 8)
+            __finish #fn("n120Z3>021220>17062:q:" #(*exit-hooks* #fn(for-each)
    S #fn("z1700215286380861}2:7223062:" #(getprop constructor error "no default constructor for struct: ") S)
-         #fn("n10A61:")) __finish)
-            __init_globals #fn("n07021d37022@402384w4^147025d;350426;J50427w8429w:4qw;47<w=47>w?47@wA:" #(*os-name*
-  "macos" #fn("n0702161:" #(princ "\e[0m\e[1m#;> \e[0m"))
-  #fn("n0702161:" #(princ "#;> ")) *prompt* "dos" "\\" "/" *directory-separator* "\n" *linefeed*
-  *exit-hooks* *stdout* *io-out* *stdin* *io-in* *stderr* *io-err*) __init_globals)
+__finish 7)
+            __init_globals #fn("n07021d37022@402384w4^147025d;350426;J50427w8429w:4qw;47<w=47>w?47@wA:" #(*os-name*
+  "macos" #fn("n0702161:" #(princ "\e[0m\e[1m#;> \e[0m") 6)
+  #fn("n0702161:" #(princ "#;> ") 6) *prompt* "dos" "\\" "/" *directory-separator* "\n" *linefeed*
+  *exit-hooks* *stdout* *io-out* *stdin* *io-in* *stderr* *io-err*) __init_globals 6)
 ;857<865387;3D042=8751;39047>8761:" #(*os-name*
   "unknown" "plan9" "home" "macos" princ "\e]0;StreetLISP v0.999\a" "HOME" #fn(os-getenv) "lib/slrc"
-#fn(str) *directory-separator* #fn(path-exists?) load) __rcscript)
-            __script #fn("n1200>121{:" #(#fn("n070A61:" #(load))
-                                         #fn("n1700514212205161:" #(top-level-exception-handler
-                                                                    #fn(exit)
+ #fn(path-exists?) load) __rcscript 11)
+            __script #fn("n1200>121{:" #(#fn("n070A61:" #(load) 6)
+                                         #fn("n1700514212205161:" #(top-level-exception-handler
+                                                                    #fn(exit)
                                                            #fn(str)))) __script)
             __start #fn("n2705040w141w240=B3@00=w14730T51@50Dw24723>0745047550@30q42660:" #(__init_globals
-23500U:0:" #() abs) add-exit-hook
+ 6) any #fn("n21B;3D0401<51;J:047001=62:" #(any) any 7)
             #fn("n1070Pw047160:" #(*exit-hooks* void) add-exit-hook) any #fn("n21B;3D0401<51;J:047001=62:" #(any) any)
-62:" #(any) any)
+3  fixnum? 1  cdr 1  atom? 1  div0 2  vec? 1  equal? 2  eqv? 2  compare 2  not 1  set-cdr! 2  num? 1  fn? 1  eq? 2  builtin? 1  cons? 1  set-car! 2)
 xnum? 1  cdr 1  atom? 1  div0 2  vec? 1  equal? 2  eqv? 2  compare 2  not 1  set-cdr! 2  num? 1  fn? 1  eq? 2  builtin? 1  cons? 1  set-car! 2)
             arg-error #fn("z020210P61:" #(#fn(raise) arg-error) arg-error) argc-error
- #fn("n10];JF042005185B;390485<21Q:" #(#fn(type-of) arr) arr?) assoc
+501<:13:07101=62:q:" #(caar assoc) assoc 7) assoc-list #fn("z00=85B3A00<85<P7085=f2P:q:" #(assoc-list) assoc-list 8)
 ssoc
-) assoc-list)
-            assv #fn("n2701510c3501<:13:07101=62:q:" #(caar assv) assv) bcode:indexfor
-            #fn("n20KG0r2G20861523:02186162:2286187534870r287KMp4:" #(#fn(has?)
-                                                                      #fn(get)
-                                                                      #fn(put!)) bcode:indexfor)
-            bounds-error #fn("z020210P61:" #(#fn(raise) bounds-error) bounds-error) box-vars
-            #fn("n2Ib68620086>2_486<^1161:" #(#fn("n10B3Q00<T3B070A21720<5153@30q4F<0=61:q:" #(emit
-  box caddr))) box-vars)
-            bq-bracket #fn("n20H3=070710152e2:0<22CS01El2380700=P:707324710=1K~52e3e2:0<25CT01El2390260Te2:707027710T1K~52e3e2:0<28CP01El23500T:707029710T1K~52e3e2:70710152e2:" #(list
-  bq-process unquote cons 'unquote unquote-splicing copy-list 'unquote-splicing unquote-nsplicing
-  'unquote-nsplicing) bq-bracket)
-            bq-bracket1 #fn("n20B3S00<20CL01El23500T:7122730=1K~52e3:730162:" #(unquote cons 'unquote
-                                                                                bq-process) bq-bracket1)
-            bq-process #fn("n20R380200e2:0]3T0717205115286<73C907486=P:757486e3:0H3400:0<26CB07327710T1KM52e3:0<28CV01El23?0790r2523500T:7:2;710=1K~52e3:7<7=052Jt07>0512?2@1>105286J807387P:87=JA07:87<7186152e3:2A7B87P7186152e162:Ib6862C186>2_486<^10q62:" #(quote
-  bq-process vec->list list vec apply quasiquote 'quasiquote unquote length= cons 'unquote any
-  splice-form? lastcdr #fn(map) #fn("n1700A62:" #(bq-bracket1))
-  #fn(nconc) list* #fn("n20J;02071151P:0B3o00<22CX020731AEl23700=@C07425e2760=AK~52e252P:F<0=770<A521P62:2071760A521P51P:" #(nconc
-  reverse! unquote nreconc list 'unquote bq-process bq-bracket))) bq-process)
-            builtin->instruction #fn("n120A0q63:" #(#fn(get)) #(#table(#.cadr cadr  #.aset! aset!  #.+ +  #.- -  #.equal? equal?  #.eq? eq?  #.builtin? builtin?  #.not not  #.cons? cons?  #.cdr cdr  #./ /  #.div0 div0  #.set-car! set-car!  #.vec vec  #.set-cdr! set-cdr!  #.< <  #.aref aref  #.for for  #.cons cons  #.apply apply  #.eqv? eqv?  #.vec? vec?  #.list list  #.car car  #.bound? bound?  #.nan? nan?  #.fn? fn?  #.sym? sym?  #.compare compare  #.fixnum? fixnum?  #.atom? atom?  #.= =  #.num? num?  #.* *)))
-            caaaar #fn("n10<<<<:" #() caaaar) caaadr
-            #fn("n10T<<:" #() caaadr) caaar #fn("n10<<<:" #() caaar) caadar
-            #fn("n10<T<:" #() caadar) caaddr #fn("n10=T<:" #() caaddr) caadr
-            #fn("n10T<:" #() caadr) caar #fn("n10<<:" #() caar) cadaar
-            #fn("n10<<T:" #() cadaar) cadadr #fn("n10TT:" #() cadadr) cadar
+indexfor
+            #fn("n20KG0r2G20861523:02186162:2286187534870r287KMp4:" #(#fn(has?)
+                                                                      #fn(get)
+                                                                      #fn(put!)) bcode:indexfor 11)
+            bcode:stack #fn("n20r4G1M0r5G86L23;00r586p@30q40r486p:" #() bcode:stack 8) bounds-error
+            #fn("z020210P61:" #(#fn(raise) bounds-error) bounds-error 7) box-vars #fn("n2Ib68620086>2_486<^1161:" #(#fn("n10B3Q00<T3B070A21720<5153@30q4F<0=61:q:" #(emit
+  box caddr) 9)) box-vars 6)
+            bq-bracket #fn("n20H3=070710152e2:0<22CS01El2380700=P:707324710=1K~52e3e2:0<25CT01El2390260Te2:707027710T1K~52e3e2:0<28CP01El23500T:707029710T1K~52e3e2:70710152e2:" #(list
+  bq-process unquote cons 'unquote unquote-splicing copy-list 'unquote-splicing unquote-nsplicing
+  'unquote-nsplicing) bq-bracket 11)
+            bq-bracket1 #fn("n20B3S00<20CL01El23500T:7122730=1K~52e3:730162:" #(unquote cons 'unquote
+                                                                                bq-process) bq-bracket1 10)
+            bq-process #fn("n20R380200e2:0]3T0717205115286<73C907486=P:757486e3:0H3400:0<26CB07327710T1KM52e3:0<28CV01El23?0790r2523500T:7:2;710=1K~52e3:7<7=052Jt07>0512?2@1>105286J807387P:87=JA07:87<7186152e3:2A7B87P7186152e162:Ib6862C186>2_486<^10q62:" #(quote
+  bq-process vec->list list vec apply quasiquote 'quasiquote unquote length= cons 'unquote any
+  splice-form? lastcdr #fn(map) #fn("n1700A62:" #(bq-bracket1) 7)
+  #fn(nconc) list* #fn("n20J;02071151P:0B3o00<22CX020731AEl23700=@C07425e2760=AK~52e252P:F<0=770<A521P62:2071760A521P51P:" #(nconc
+  reverse! unquote nreconc list 'unquote bq-process bq-bracket) 12)) bq-process 11)
+            builtin->instruction #fn("n120A0q63:" #(#fn(get)) #(#table(#.cadr cadr  #.aset! aset!  #.+ +  #.- -  #.equal? equal?  #.eq? eq?  #.builtin? builtin?  #.not not  #.cons? cons?  #.cdr cdr  #./ /  #.div0 div0  #.set-car! set-car!  #.vec vec  #.set-cdr! set-cdr!  #.< <  #.aref aref  #.for for  #.cons cons  #.apply apply  #.eqv? eqv?  #.vec? vec?  #.list list  #.car car  #.bound? bound?  #.nan? nan?  #.fn? fn?  #.sym? sym?  #.compare compare  #.fixnum? fixnum?  #.atom? atom?  #.= =  #.num? num?  #.* *)) 8)
+            caaaar #fn("n10<<<<:" #() caaaar 5) caaadr
+            #fn("n10T<<:" #() caaadr 5) caaar #fn("n10<<<:" #() caaar 5) caadar
+            #fn("n10<T<:" #() caadar 5) caaddr #fn("n10=T<:" #() caaddr 5) caadr
+            #fn("n10T<:" #() caadr 5) caar #fn("n10<<:" #() caar 5) cadaar
+            #fn("n10<<T:" #() cadaar 5) cadadr #fn("n10TT:" #() cadadr 5) cadar
+            #fn("n10<T:" #() cadar 5) caddar #fn("n10<=T:" #() caddar 5) cadddr
 "n10<T:" #() cadar) caddar #fn("n10<=T:" #() caddar) cadddr
-fn("n10==T:" #() cadddr) caddr #4=#fn("n10=T:" #() caddr) call-with-values
-            #fn("n205086B3@0A86<C90186=}2:18661:" #() #(#3=(*values*))) capture-var! #fn("n20r3G70186E5387;JG042186510r322861e152p4:" #(index-of
-  #fn(length) #fn(nconc)) capture-var!)
-            cdaaar #fn("n10<<<=:" #() cdaaar) cdaadr
+("n10=T:" #() caddr 5) call-with-values
+            #fn("n205086B3@0A86<C90186=}2:18661:" #() #(#3=(*values*)) 7) capture-var! #fn("n20r3G70186E5387;JG042186510r322861e152p4:" #(index-of
+  #fn(length) #fn(nconc)) capture-var! 12)
+            cdaaar #fn("n10<<<=:" #() cdaaar 5) cdaadr
+            #fn("n10T<=:" #() cdaadr 5) cdaar #fn("n10<<=:" #() cdaar 5) cdadar
 ar) cdaddr #fn("n10=T=:" #() cdaddr) cdadr
-         #fn("n10<<==:" #() cddaar) cddadr #fn("n10T==:" #() cddadr) cddar
+#fn("n10<===:" #() cdddar 5) cddddr
 ("n10T==:" #() cddadr) cddar
-0887283=23523q07401q895440r40r4GKMp4750183=530r40r4G8:UMp47608237027@40288:63:89[;3904798951892:Cf07089152J\\0212:517:d3P07;83r2523E07401q83T5447602:62:89B3N089<2<CF07=83513=07>01828364:8:360q@F07401q895440r40r4GKMp4750183=530r40r4G8;UMp48:360q@=00r40r4Gr/Mp48:3C07?018283898:8;67:760823702@@402A8;63:" #(in-env?
+517;d3P07<83r2523E07401q83T5447702;62:89B3N089<2=CF07>83513=07?01828364:8:360q@B07401q89544750K524760183=537508;U5248:360q@90750r/5248:3C07@018283898:8;67:770823702A@402B8;63:" #(in-env?
 27@40288:63:89[;3904798951892:Cf07089152J\\0212:517:d3P07;83r2523E07401q83T5447602:62:89B3N089<2<CF07=83513=07>01828364:8:360q@F07401q895440r40r4GKMp4750183=530r40r4G8;UMp48:360q@=00r40r4Gr/Mp48:3C07?018283898:8;67:760823702@@402A8;63:" #(in-env?
-CF07=83513=07>01828364:8:360q@F07401q895440r40r4GKMp4750183=530r40r4G8;UMp48:360q@=00r40r4Gr/Mp48:3C07?018283898:8;67:760823702@@402A8;63:" #(in-env?
-  #fn(top-level-value) length> 255 compile-in compile-arglist emit tcall.l call.l
-  builtin->instruction cadr length= λ inlineable? compile-let compile-builtin-call tcall call) compile-app)
-            compile-arglist #fn("n3202101>282524228261:" #(#fn(for-each)
-                                                           #fn("n170AFq0544Ar4Ar4GKMp:" #(compile-in))
-                                                           #fn(length)) compile-arglist)
+@402B8;63:" #(in-env?
+  #fn(top-level-value) length> 255 compile-in bcode:stack compile-arglist emit tcall.l call.l
+  builtin->instruction cadr length= λ inlineable? compile-let compile-builtin-call tcall call) compile-app 16)
+            compile-arglist #fn("n3202101>282524228261:" #(#fn(for-each)
+                                                           #fn("n170AFq054471AK62:" #(compile-in
+                                                                                      bcode:stack) 9)
 <5447202352474018283=64:" #(compile-in
   void emit pop compile-begin) compile-begin)
             compile-builtin-call #fn("n7I202186850>3?;514227385q538<3I07483=8<52J=075858<52@30q4858=26CL086El23:07702862:770858663:8=29C708;60:8=2:C708;60:8=2;C]086El23:07702<62:86r2l23:07702=62:770858663:8=2>Cm086El23:07585K62:86Kl23:07702?62:86r2l23:07702@62:770858663:8=2ACL086El23:07702B62:770858663:8=2CCL086El23:07585K62:770858663:8=2DCN086El23<07702E2F63:770858663:8=2GCX086r2L23;07585r262:770823702H@402G8663:8=2ICb086r2l23:07702J62:r286L23?07708586r3~63:7585r262:7708562:" #(#0#
-0858663:8=2>Cm086El23:07585K62:86Kl23:07702?62:86r2l23:07702@62:770858663:8=2ACL086El23:07702B62:770858663:8=2CCL086El23:07585K62:770858663:8=2DCN086El23<07702E2F63:770858663:8=2GCX086r2L23;07585r262:770823702H@402G8663:8=2ICb086r2l23:07702J62:r286L23?07708586r3~63:7585r262:7708562:" #(#0#
-  #fn("n0AEl239070FK62:7192FA63:" #(argc-error emit) num-compare)
+l23:07702?62:86r2l23:07702@62:770858663:8=2ACL086El23:07702B62:770858663:8=2CCL086El23:07585K62:770858663:8=2DCN086El23<07702E2F63:770858663:8=2GCX086r2L23;07585r262:770823702H@402G8663:8=2ICb086r2l23:07702J62:r286L23?07708586r3~63:7585r262:7708562:" #(#0#
+  #fn("n0AEl239070FK62:7192FA63:" #(argc-error emit) num-compare 8)
 6El23<07702E2F63:770858663:8=2GCX086r2L23;07585r262:770823702H@402G8663:8=2ICb086r2l23:07702J62:r286L23?07708586r3~63:7585r262:7708562:" #(#0#
- arg-counts length= argc-error list emit loadnil < = + load0 add2 - neg sub2 * load1 /
+l < = + load0 add2 - neg sub2 * load1 /
 neg sub2 * load1 /
   vec loadv #() apply tapply aref aref2) compile-builtin-call)
             compile-error #fn("z070210P}2:" #(error "compile error: ") compile-error) compile-f
-=863J0702185>18652;J904A<8661:q:" #(any #fn("n1A0Q;3404A:")) any-duplicates)
+4A<8661:q:" #(any #fn("n1A0Q;3404A:" 6)) any-duplicates 9)
 plicates)
-cddr λ #fn(length) keyword-arg?
+keyword-arg?
 ect-hash-table cons car
   iota keyargs 255 vargc.l argc.l vargc argc emit-optional-arg-inits #fn(append)
-s compile-in ret values #fn(fn)
-  encode-byte-code const-to-idx-vec) compile-f-)
-            compile-if #fn("n420502050205083T718351728351B3;0738351@30q8;DC=07401828<64:8;J=07401828=64:7401q8;89554750268953475027885347401828<544823<07502852@;0750298:53475027895347401828=544750278:63:" #(#fn(gensym)
-  caddr cdddr cadddr compile-in emit brn label ret jmp) compile-if)
-            compile-in #fn("\x8740005000W4000J60q?4483R3<0700183D64:83H3\x97083EC:07102262:83KC:07102362:83DC:07102462:83J:07102562:7683513:07102762:7883513<0710298363:7102:8363:83<2;C<07<0183=63:83<RS;JD0483<Z;J;047=83<1523=07>01828364:83<892?CS07@83T513>07A018283T64:7102:83T63:892BC=07C01828364:892DC>07E018283=64:892FC;07G018363:892HCD07I2J183>22K01>262:892LC@07M018283=8465:892NC>07O018283=64:892PCE07Q0183T2D7R8351P64:892SCS07A01D83=B38083T@607T505447102U62:892VC\x97083T7W7R8351518;<<8;=8:R360q@>07X2Y2Z8:2[5448<3Y07\\8:8<8=<B;3F048=<<2HQ;3:047]8=<5153@30q47^018:8=<64:892_Cp07A01q2Hq83Te35447`7a835151360q@807b2c5147A01q7a83515447102_62:7>01828364:" #(compile-sym
-  emit load0 load1 loadt loadnil void? loadvoid fits-i8 loadi8 loadv aset! compile-aset! in-env?
-  compile-app quote self-evaluating? compile-in if compile-if begin compile-begin prog1
-  compile-prog1 λ call-with-values #fn("n070AF62:" #(compile-f-))
-  #fn("n270A21053413K02223AF>2152470A242515163:q:" #(emit loadv #fn(for-each)
-                                                     #fn("n170AF0q64:" #(compile-sym)) closure #fn(length)))
-  and compile-and or compile-or while compile-while cddr return void ret set!
+ ret
+  values #fn(fn) encode-byte-code const-to-idx-vec) compile-f- 30)
+            compile-if #fn("n420502050205083T718351728351B3;0738351@30q8;DC=07401828<64:8;J=07401828=64:7401q8;89554750268953475027885347401828<544823<07502852@;0750298:53475027895347401828=544750278:63:" #(#fn(gensym)
+  caddr cdddr cadddr compile-in emit brn label ret jmp) compile-if 16)
+            compile-in #fn("\x8740005000W4000J60q?4483R3<0700183D64:83H3\x97083EC:07102262:83KC:07102362:83DC:07102462:83J:07102562:7683513:07102762:7883513<0710298363:7102:8363:83<2;C<07<0183=63:83<RS;JD0483<Z;J;047=83<1523=07>01828364:83<892?CS07@83T513>07A018283T64:7102:83T63:892BC=07C01828364:892DC>07E018283=64:892FC;07G018363:892HCD07I2J183>22K01>262:892LC@07M018283=8465:892NC>07O018283=64:892PCE07Q0183T2D7R8351P64:892SCS07A01D83=B38083T@607T505447102U62:892VC\x97083T7W7R8351518;<<8;=8:R360q@>07X2Y2Z8:2[5448<3Y07\\8:8<8=<B;3F048=<<2HQ;3:047]8=<5153@30q47^018:8=<64:892_Cp07A01q2Hq83Te35447`7a835151360q@807b2c5147A01q7a83515447102_62:7>01828364:" #(compile-sym
+  emit load0 load1 loadt loadnil void? loadvoid fits-i8 loadi8 loadv aset! compile-aset! in-env?
+  compile-app quote self-evaluating? compile-in if compile-if begin compile-begin prog1
+  compile-prog1 λ call-with-values #fn("n070AF62:" #(compile-f-) 7)
+  #fn("n270A21053413K02223AF>2152470A242515163:q:" #(emit loadv #fn(for-each)
+                                                     #fn("n170AF0q64:" #(compile-sym) 9) closure #fn(length)) 9)
+  and compile-and or compile-or while compile-while cddr return void ret set!
 )
   #fn("n270A21053413K02223AF>2152470A242515163:q:" #(emit loadv #fn(for-each)
-ody type-error "set!" symbol "name" sym-set-doc lambda:vars compile-set!
-  trycatch 1arg-lambda? caddr compile-error "trycatch: second form must be a 1-argument lambda") compile-in)
-            compile-let #fn("n483<83=0r4G88T70018953718;727388518;528:537408=524258=1<521=P7608>827388515440r40r4G8<UMp4E8<L23A082J<0770288<63:q:" #(compile-arglist
-  vars-to-env complex-bindings caddr box-vars #fn(nconc) compile-in emit shift) compile-let)
+m-set-doc lambda:vars compile-set!
+  trycatch 1arg-lambda? caddr compile-error "trycatch: second form must be a 1-argument lambda") compile-in 14)
+            compile-let #fn("n483<83=0r4G88T70018953718;727388518;528:537408=524258=1<521=P7608>827388515447708<U524E8<L23A082J<0780298<63:q:" #(compile-arglist
+  vars-to-env complex-bindings caddr box-vars #fn(nconc) compile-in bcode:stack emit shift) compile-let 17)
 -arglist
   vars-to-env complex-bindings caddr box-vars #fn(nconc) compile-in emit shift) compile-let)
-e-or)
-            compile-prog1 #fn("n37001q82T544718251B3_00r40r4GKMp47201q718251544730245240r40r4Gr/Mp:q:" #(compile-in
+n("n37001q82T544718251B3W0720K5247301q71825154474025524720r/62:q:" #(compile-in
+  cddr bcode:stack compile-begin emit pop) compile-prog1 10)
 44730248263:88<El288=T893<07588=51@9076082528:3o07308937027@40288;5340r40r4GKMp47201q835440r40r4Gr/Mp47302962:7201q8354489360q@>07:2;2<82525147302=8;63:" #(lookup-sym
   global compile-in emit setg vinfo:index capture-var! loada loadc set-car! error #fn(str)
-("n783H3?0700182848665:83=H3@070018283<8665:86;J70421507001q83<865540r40r4GKMp486360q@9072023524720858;5340r40r4Gr/Mp486360q@907202452475018283=84858657486340q:720268;63:" #(compile-in
+=H3@070018283<8665:86;J70421507001q83<86554720K52486360q@9073024524730858;534720r/52486360q@907302552476018283=84858657486340q:730278;63:" #(compile-in
 540r40r4GKMp486360q@9072023524720858;5340r40r4Gr/Mp486360q@907202452475018283=84858657486340q:720268;63:" #(compile-in
   #fn(gensym) emit dup pop compile-short-circuit label) compile-short-circuit)
--circuit label) compile-short-circuit)
+rt-circuit 13)
 251513@07502624825163:750278263:88<El23W0750287988=51534833A088=T3:07502:62:q:7502;7<08252534833A088=T3:07502:62:q:" #(lookup-sym
-833A088=T3:07502:62:q:" #(lookup-sym
-  global #fn(const?) printable? #fn(top-level-value) emit loadv loadg loada vinfo:index car loadc
+okup-sym
+  global #fn(const?) printable? #fn(top-level-value) emit loadv loadg loada vinfo:index car loadc
 ile-thunk #fn("n170q21q72051e362:" #(compile-f λ lower-def) compile-thunk)
-er-def) compile-thunk)
+     compile-while #fn("n4205020507101q7250544730K52474025885347101q82544740268953474027524730r/5247101q835447402888534740258963:" #(#fn(gensym)
 2589534730265240r40r4Gr/Mp47101q835447302788534730248963:" #(#fn(gensym)
   compile-in void emit label brn pop jmp) compile-while)
-                                                                              complex-bindings-
-                                                                              filter #fn("n120A062:" #(#fn(has?)))
-                                                                              table-keys) complex-bindings)
-            complex-bindings- #fn("n61J40q:0R3K0833D02001523;021840D63:q:0H;J80472051340q:0<23Co0200T1523Q021850TD534833>021840TD53@30q@30q474750511q83848566:0<26CU074770517817905152q82S;J50483848566:740<17:051838485562;2<1838485>40=52P:" #(#fn(memq)
-  #fn(put!) quoted? set! complex-bindings- caddr λ lambda:body diff lambda:vars inlineable? #fn(map)
-  #fn("n1700AqF929366:" #(complex-bindings-))) complex-bindings-)
-            const-to-idx-vec #fn("n1200r2G51212285>10KG52485:" #(#fn(vec-alloc)
-                                                                 #fn(for-each)
-                                                                 #fn("n2A10p:")) const-to-idx-vec)
+                                                   complex-bindings-
+                                                                              filter #fn("n120A062:" #(#fn(has?)) 7)
+                                                                              table-keys) complex-bindings 13)
+            complex-bindings- #fn("n61J40q:0R3K0833D02001523;021840D63:q:0H;J80472051340q:0<23Co0200T1523Q021850TD534833>021840TD53@30q@30q474750511q83848566:0<26CU074770517817905152q82S;J50483848566:740<17:051838485562;2<1838485>40=52P:" #(#fn(memq)
+  #fn(put!) quoted? set! complex-bindings- caddr λ lambda:body diff lambda:vars inlineable? #fn(map)
+  #fn("n1700AqF929366:" #(complex-bindings-) 11)) complex-bindings- 11)
+            const-to-idx-vec #fn("n1200r2G51212285>10KG52485:" #(#fn(vec-alloc)
+                                                                 #fn(for-each)
 7=:" #(#0#
   #fn("n382;3?0482El2;3504I:41360q@40I:41<qP087N4A<871=82;390470825163:" #(1-) copy-)) copy-list)
-                           #fn("n31J5082:A<01=01<5139082KM@408263:" #() count-)) count)
+6>1_51486<01E63:" #(#0#
 9082KM@408263:" #() count-)) count)
             delete-duplicates #fn("n1700rD523O02150Ib686228586>2_486<^10q62:0H3400:0<0=73858652390748661:85748651P:" #(length>
   #fn(table) #fn("n20H38070161:21A0<523:0F<0=162:22A0<D534F<0=0<1P62:" #(reverse! #fn(has?)
@@ -260,146 +265,148 @@
 8<12EQ;3b04892FCB00E82<2G88=PPp@J0892HCB00E82<2I88=PPp@30q;J@040E7J182P8852p^140:" #(#0#
   #fn("n17002162:" #(member (load0 load1 loadt loadf loadnil loadvoid)) load?) car cdr cadr pop #fn(memq)
   (loadv loadg setg) bcode:indexfor #fn(assq) ((loadv loadv.l) (loadg loadg.l) (setg setg.l) (loada
-) (loada
-  loada.l)
-                                                               (seta seta.l) (box box.l)) 255 ((loadc
-  loadc.l)) loada (0) loada0 (1) loada1 loadc loadc0 loadc1 brn not brnn eq? brne nreconc) emit)
-            emit-optional-arg-inits #fn("n582B3\xa70205071022845347382513<07102452@30q471025895347607717883E8453q53q7982515447102:845347102;5247102<895347=0182=8384KM65:q:" #(#fn(gensym)
+r #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 brn not brnn eq? brne nreconc) emit 12)
+            emit-optional-arg-inits #fn("n582B3\xa70205071022845347382513<07102452@30q471025895347607717883E8453q53q7982515447102:845347102;5247102<895347=0182=8384KM65:q:" #(#fn(gensym)
+  emit bounda cddar dup brnn compile-in extend-env subseq cadar seta pop label
 65:q:" #(#fn(gensym)
--arg-inits) emit-optional-arg-inits)
-            encode-byte-code #fn("n1700517185512286517387r387r2ki2M2452255025502650qqEI8>87L23\xbc14868>G?<48<27CP02889868>KMG298;515348>r2M?>@\x8b12:8;2;7<883k08<8C2=C702>@X08C2?C702@@L08C2AC702B@@08C2CC702D@408<^1@408<525248>KM?>48>87L2;3804868>G?=42E8<2F523`0288:298;518=5342:8;883707G@407HE515248>KM?>@\xeb08<2ICH02:8;2J8=515248>KM?>@\xce08=X3\xc708<2E8?2K523H02:8;2J8=515248>KM?>@\x9f02E8?2L523\x8102:8;2J8=515248>KM?>42:8;2J868>G515248>KM?>48<2MCK02:8;2J868>G515248>KM?>@30q@E02:8;2N8=515248>KM?>^1@30q@\x9f.42O2P8;8889>38:5242Q8;61:" #(reverse!
-  list->vec #fn(length) >= 65536 #fn(table) #fn(buffer) label #fn(put!)
+optional-arg-inits 13)
+            encode-byte-code #fn("n1700517185512286517387r387r2ki2M2452255025502650qqEI8>87L23\xbc14868>G?<48<27CP02889868>KMG298;515348>r2M?>@\x8b12:8;2;7<883k08<8C2=C702>@X08C2?C702@@L08C2AC702B@@08C2CC702D@408<^1@408<525248>KM?>48>87L2;3804868>G?=42E8<2F523`0288:298;518=5342:8;883707G@407HE515248>KM?>@\xeb08<2ICH02:8;2J8=515248>KM?>@\xce08=X3\xc708<2E8?2K523H02:8;2J8=515248>KM?>@\x9f02E8?2L523\x8102:8;2J8=515248>KM?>42:8;2J868>G515248>KM?>48<2MCK02:8;2J868>G515248>KM?>@30q@E02:8;2N8=515248>KM?>^1@30q@\x9f.42O2P8;8889>38:5242Q8;61:" #(reverse!
+  list->vec #fn(length) >= 65536 #fn(table) #fn(buffer) label #fn(put!)
 3`0288:298;518=5342:8;883707G@407HE515248>KM?>@\xeb08<2ICH02:8;2J8=515248>KM?>@\xce08=X3\xc708<2E8?2K523H02:8;2J8=515248>KM?>@\x9f02E8?2L523\x8102:8;2J8=515248>KM?>42:8;2J868>G515248>KM?>48<2MCK02:8;2J868>G515248>KM?>@30q@E02:8;2N8=515248>KM?>^1@30q@\x9f.42O2P8;8889>38:5242Q8;61:" #(reverse!
   list->vec #fn(length) >= 65536 #fn(table) #fn(buffer) label #fn(put!)
-8>KM?>^1@30q@\x9f.42O2P8;8889>38:5242Q8;61:" #(reverse!
+8;8889>38:5242Q8;61:" #(reverse!
 uffer) label #fn(put!)
   #fn(sizeof) #fn(io-write) #fn(get) Instructions jmp jmp.l brne brne.l brnn brnn.l brn brn.l #fn(memq)
-                    call.l tcall.l loadc.l box.l) (optargs keyargs)
-  keyargs #fn(u8) #fn(for-each) #fn("n220A052421AF37072@407324921520~5162:" #(#fn(io-seek)
-                                                                              #fn(io-write) s32 s16
+call.l loadc.l box.l) (optargs keyargs)
+  keyargs #fn(u8) #fn(for-each) #fn("n220A052421AF37072@407324921520~5162:" #(#fn(io-seek)
+                                                                              #fn(io-write) s32 s16
                                     #fn(io-write) s32 s16
                                                                               #fn(get)))
-)
+   find #fn("O200050007000W2000J7071?24W3000J7072?34W4000J60E?44W5000J60q?54W6000J60q?647324830>2125822684278528866::" #(#(:key
 47324830>2125822684278528866::" #(#(:key
-3 :start 2 NIL NIL NIL NIL NIL NIL NIL NIL
-  NIL NIL NIL NIL :from-end 4) identity equal? find-if #fn("n1AF062:") :key :start :end :from-end) find)
-            find-if #fn("O200040006000W2000J7071?24W3000J60E?34W4000J60q?44W5000J60q?54Ib:228:230828:>3_514741838453?14853<075151?1@30q48:<161:" #(#(:key
+L NIL NIL NIL NIL NIL NIL NIL
+  NIL NIL NIL NIL :from-end 4) identity equal? find-if #fn("n1AF062:" 7) :key :start :end :from-end) find 15)
+            find-if #fn("O200040006000W2000J7071?24W3000J60E?34W4000J60q?44W5000J60q?54Ib:228:230828:>3_514741838453?14853<075151?1@30q48:<161:" #(#(:key
 853<075151?1@30q48:<161:" #(#(:key
   0 NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL :end 2 :start 1 NIL NIL NIL NIL NIL NIL NIL NIL
-513500<:92<0=61:" #() find-if-)
-  subseq reverse!) find-if)
-            fits-i8 #fn("n10Y;3<0470r\xaf0r\xb063:" #(>=) fits-i8) fn-disasm
-            #fn("\x871000.///z2W1000J60q?140[3I07021122534735047460:@30q482JG07501E534735047460:@30q482<2605127051II282987>1?:514282:187>2?;514E2;8851b<I8<<8=L23\x8a242<2=888<>2q7>53E8<<L23907350@30q4E87K~2?|48<8<<KM_48>2@8?2A523[08;8>8<<r45348:897B888<<52G5148<8<<r4M_@\x1912@8?2C523V08;8>8<<K5348:89888<<GG5148<8<<KM_@\xea12@8?2D523e08;8>8<<K534702E888<<G8>2FC70r3@30EM515148<8<<KM_@\xac12@8?2G523\\08;8>8<<r4534702E7B888<<52515148<8<<r4M_@w12@8?2H523\xb808;8>8<<r88>2IC70r4@30EM534702E7B888<<52512J5248<8<<r4M_4702E7B888<<52515148<8<<r4M_48>2ICY0702J514702E7B888<<52512J5248<8<<r4M_@30q@\xe608?2Kc3^08;8>8<<r4534702E7B888<<52512J5248<8<<r4M_@\xb202@8?2L523b08;8>8<<r2534702M7N8<<7O888<<52M515248<8<<r2M_@w02@8?2P523b08;8>8<<r4534702M7N8<<7B888<<52M515248<8<<r4M_@<08;8>8<<E53^1^1@\xd0-:" #(princ
-  " > " " // PC" newline void fn-disasm #fn(fn-code)
-  #fn(fn-vals) #1# #fn("n10\\3F00[JA070504710qAKM63:72061:" #(newline fn-disasm print) print-val)
+:" #() find-if- 7)
+  subseq reverse!) find-if 9)
+            fits-i8 #fn("n10Y;3<0470r\xaf0r\xb063:" #(>=) fits-i8 8) fn-disasm
+            #fn("\x871000.///z2W1000J60q?140[3I07021122534735047460:@30q482JG07501E534735047460:@30q482<2605127051II282987>1?:514282:187>2?;514E2;8851b<I8<<8=L23\x8a242<2=888<>2q7>53E8<<L23907350@30q4E87K~2?|48<8<<KM_48>2@8?2A523[08;8>8<<r45348:897B888<<52G5148<8<<r4M_@\x1912@8?2C523V08;8>8<<K5348:89888<<GG5148<8<<KM_@\xea12@8?2D523e08;8>8<<K534702E888<<G8>2FC70r3@30EM515148<8<<KM_@\xac12@8?2G523\\08;8>8<<r4534702E7B888<<52515148<8<<r4M_@w12@8?2H523\xb808;8>8<<r88>2IC70r4@30EM534702E7B888<<52512J5248<8<<r4M_4702E7B888<<52515148<8<<r4M_48>2ICY0702J514702E7B888<<52512J5248<8<<r4M_@30q@\xe608?2Kc3^08;8>8<<r4534702E7B888<<52512J5248<8<<r4M_@\xb202@8?2L523b08;8>8<<r2534702M7N8<<7O888<<52M515248<8<<r2M_@w02@8?2P523b08;8>8<<r4534702M7N8<<7B888<<52M515248<8<<r4M_@<08;8>8<<E53^1^1@\xd0-:" #(princ
+  " > " " // PC" newline void fn-disasm #fn(fn-code)
+  #fn(fn-vals) #1# #fn("n10\\3F00[JA070504710qAKM63:72061:" #(newline fn-disasm print) print-val 9)
 4702E7B888<<52515148<8<<r4M_48>2ICY0702J514702E7B888<<52512J5248<8<<r4M_@30q@\xe608?2Kc3^08;8>8<<r4534702E7B888<<52512J5248<8<<r4M_@\xb202@8?2L523b08;8>8<<r2534702M7N8<<7O888<<52M515248<8<<r2M_@w02@8?2P523b08;8>8<<r4534702M7N8<<7B888<<52M515248<8<<r4M_@<08;8>8<<E53^1^1@\xd0-:" #(princ
-b08;8>8<<r2534702M7N8<<7O888<<52M515248<8<<r2M_@w02@8?2P523b08;8>8<<r4534702M7N8<<7B888<<52M515248<8<<r4M_@<08;8>8<<E53^1^1@\xd0-:" #(princ
-  " > " " // PC" newline void fn-disasm #fn(fn-code)
-  #fn(fn-vals) #1# #fn("n10\\3F00[JA070504710qAKM63:72061:" #(newline fn-disasm print) print-val)
-  #fn("n370A3U0FEl23N071A72151523A0A182ML237023@4024751K~512602765:" #(princ >= 1- " >" "  " hex5
-                                                                       ":  " " ") print-inst)
-  #fn(length) #fn(table-foldl) #fn("n382;J@041AF<Gl2;34040:") Instructions #fn("n1702161:" #(princ
+888<<52M515248<8<<r2M_@w02@8?2P523b08;8>8<<r4534702M7N8<<7B888<<52M515248<8<<r4M_@<08;8>8<<E53^1^1@\xd0-:" #(princ
+  " > " " // PC" newline void fn-disasm #fn(fn-code)
+  #fn(fn-vals) #1# #fn("n10\\3F00[JA070504710qAKM63:72061:" #(newline fn-disasm print) print-val 9)
+  #fn("n370A3U0FEl23N071A72151523A0A182ML237023@4024751K~512602765:" #(princ >= 1- " >" "  " hex5
+                                                                       ":  " " ") print-inst 10)
+  #fn(length) #fn(table-foldl) #fn("n382;J@041AF<Gl2;34040:" 7) Instructions #fn("n1702161:" #(princ
 AF<Gl2;34040:") Instructions #fn("n1702161:" #(princ
-32-LE (loadv loadg setg)
+ada seta loadc call tcall list + - * / < = vec argc vargc loadi8 apply tapply closure box
 * / < = vec argc vargc loadi8 apply tapply closure box
    shift aref) #fn(num->str) aref (loada.l seta.l loadc.l argc.l vargc.l call.l tcall.l box.l) (optargs
-l.l tcall.l box.l) (optargs
-  keyargs) keyargs " " bounda (jmp brne brnn brn) "@" hex5 ref-s16-LE (jmp.l brne.l brnn.l brn.l)) fn-disasm)
-            foldl #fn("n382J401:700082<15282=63:" #(foldl) foldl) foldr
-            #fn("n382J401:082<700182=5362:" #(foldr) foldr) get-defined-vars #fn("n170A<05161:" #(delete-duplicates) #(#2=(#fn("n10H340q:0<20Cd00=B3^00TR;37040Te1;JM040TB;3E0471051R;3:0471051e1:0<22C?07324A<0=52}2:q:" #(def
+yargs) keyargs " " bounda (jmp brne brnn brn) "@" hex5 ref-s16-LE (jmp.l brne.l brnn.l brn.l)) fn-disasm 20)
+            foldl #fn("n382J401:700082<15282=63:" #(foldl) foldl 9) foldr
+            #fn("n382J401:082<700182=5362:" #(foldr) foldr 10) get-defined-vars #fn("n170A<05161:" #(delete-duplicates) #(#2=(#fn("n10H340q:0<20Cd00=B3^00TR;37040Te1;JM040TB;3E0471051R;3:0471051e1:0<22C?07324A<0=52}2:q:" #(def
+  caadr begin nconc #fn(map)) #(#2#) 8))) 7)
 <05161:" #(delete-duplicates) #(#2=(#fn("n10H340q:0<20Cd00=B3^00TR;37040Te1;JM040TB;3E0471051R;3:0471051e1:0<22C?07324A<0=52}2:q:" #(def
   caadr begin nconc #fn(map)) #(#2#)))))
             get-syntax #fn("n120710q63:" #(#fn(get) *syntax-environment*) get-syntax) getprop
             #fn("\x8720003000W2000J60q?2420711q5387;3<04208708253;J50482:" #(#fn(get) *properties*) getprop)
-08708253;J50482:" #(#fn(get) *properties*) getprop)
-            help-print-header #fn("O200020004000W2000J60q?24W3000J7021?3413A02223830>2152@V07483514823@074750512652@70770514785047860:" #(#(:kind
+t) *properties*) getprop 9)
+            help-print-header #fn("O200020004000W2000J60q?24W3000J7021?3413A02223830>2152@V07483514823@074750512652@70770514785047860:" #(#(:kind
 kind
   0 NIL NIL :lpad 1 NIL NIL) "" #fn(for-each) #fn("n170A51471F0P5147260:" #(princ print newline))
   princ caddr " (group)" print newline) help-print-header)
             hex5 #fn("n170210r@52r52263:" #(str-lpad #fn(num->str) #\0) hex5) identity
-;3i047185T51;3]04727385T52;3O047485T2552S;3@047685T270=5162:" #(λ
-  list? every sym? length> 255 length= #fn(length)) inlineable?)
-            io-readall #fn("n1205021850524228561:" #(#fn(buffer)
-                                                     #fn(io-copy)
-                                                     #fn(io->str)) io-readall)
-            io-readline #fn("n12002162:" #(#fn(io-readuntil) #\newline) io-readline) io-readlines
-            #fn("n17071062:" #(read-all-of io-readline) io-readlines) iota #fn("n17071062:" #(map-int
-  identity) iota)
-            keyword->sym #fn("n1200513K021220512386K24865153^161:0:" #(#fn(keyword?)
-                                                                       #fn(sym)
-                                                                       #fn(str)
-                                                                       #fn(str-sub)
+04727385T52;3O047485T2552S;3@047685T270=5162:" #(λ
+  list? every sym? length> 255 length= #fn(length)) inlineable? 9)
+            io-readall #fn("n1205021850524228561:" #(#fn(buffer)
+                                                     #fn(io-copy)
+                                                     #fn(io->str)) io-readall 8)
+            io-readline #fn("n12002162:" #(#fn(io-readuntil) #\newline) io-readline 7) io-readlines
+            #fn("n17071062:" #(read-all-of io-readline) io-readlines 7) iota #fn("n17071062:" #(map-int
+  identity) iota 7)
+            keyword->sym #fn("n1200513K021220512386K24865153^161:0:" #(#fn(keyword?)
+                                                                       #fn(sym)
+                                                                       #fn(str)
+                                                                       #fn(str-sub)
 ->sym)
-                                                             #fn("n40S;J5040R340D:0B3Z00<R3T082;J504833<0702112263:A<0=1828364:0B3\xa500<B3\x9f073051R3Y0740<r252;JF04740<r352;390475051R360q@=070260<2715442873051513=0A<0=182D64:833<0702112963:A<0=1D8364:0B3>0702:0<27164:01C:07021162:702:027164:" #(compile-error
-  "invalid argument list " ": optional arguments must come after required" caar length= caddar "invalid optional argument "
-  " in list " #fn(keyword?) ": keyword arguments must come last."
-  "invalid formal argument ") check-formals) #fn(map)
+                                  #fn("n40S;J5040R340D:0B3Z00<R3T082;J504833<0702112263:A<0=1828364:0B3\xa500<B3\x9f073051R3Y0740<r252;JF04740<r352;390475051R360q@=070260<2715442873051513=0A<0=182D64:833<0702112963:A<0=1D8364:0B3>0702:0<27164:01C:07021162:702:027164:" #(compile-error
+  "invalid argument list " ": optional arguments must come after required" caar length= caddar "invalid optional argument "
+  " in list " #fn(keyword?) ": keyword arguments must come last."
+  "invalid formal argument ") check-formals 9) #fn(map)
+                                                              #fn("n10B390700<61:0:" #(keyword->sym) 6)
 after required" caar length= caddar "invalid optional argument "
   " in list " #fn(keyword?) ": keyword arguments must come last."
-                         #fn("n10B390700<61:0:" #(keyword->sym))
-                                                              to-proper) lambda-vars)
-            lambda:body #fn("n170061:" #(caddr) lambda:body) lambda:vars
+                                                   to-proper) lambda-vars 10)
+            lambda:body #fn("n170061:" #(caddr) lambda:body 6) lambda:vars
+            #fn("n1700T61:" #(lambda-vars) lambda:vars 6) last-pair #fn("n10=H3400:700=61:" #(last-pair) last-pair 6)
 n1700T61:" #(lambda-vars) lambda:vars) last-pair #fn("n10=H3400:700=61:" #(last-pair) last-pair)
-th= #fn(length)) length=)
-            length> #fn("n21EL2340D:1El23;00B;34040:0B3<0700=1K~62:121051L2:" #(length> #fn(length)) length>)
-            list->vec #fn("n1202172063:" #(#fn(map) vec identity) list->vec) list-ref
+;34040:0B3<0700=1K~62:121051L2:" #(length> #fn(length)) length> 8)
+            list->vec #fn("n1202172063:" #(#fn(map) vec identity) list->vec 8) list-ref
+            #fn("n2700152<:" #(list-tail) list-ref 7) list-tail #fn("n2701E523400:710=1K~62:" #(<=
 5>12385>1{:" #(#fn(file) :read #fn("n0Ib48420A84>2_484<^1III63:" #(#fn("n320A51JG0F<21A510721514735063:24A514737215161:" #(#fn(io-eof?)
-735063:24A514737215161:" #(#fn(io-eof?)
-  #fn(read) load-process void #fn(io-close))))) #fn("n120A51421220e261:" #(#fn(io-close)
-                                                                           #fn(raise) load-error))) load)
+id #fn(io-close)) 9)) 8)
+                                            #fn("n120A51421220e261:" #(#fn(io-close)
+                                                                       #fn(raise) load-error) 7)) load 7)
 load-process #fn("n170061:" #(eval) load-process) lookup-sym
-3808288P:7201=82KM63:" #(global #fn(assq) lookup-sym) lookup-sym)
+obal #fn(assq) lookup-sym) lookup-sym 11)
 ;J804720513400:0<23C@024757605151e2:0<27CK02827e10Te185051e17905164:2:75062:" #(#0#
   #fn("n170051B3N071051B3=02270051P@7073051@607450758551768551863D0278687e328748652P:87:" #(cddr
-y) quoted? def #1# lower-def
-  expand-def λ #fn(nconc) lastcdr #fn(map)) lower-def)
-            macrocall? #fn("n10<R;3904700<61:" #(get-syntax) macrocall?) macroexpand
-            #fn("n1IIIIIIIIIIIb5b6b7b8b9b:b;b<b=b>b?208521_51420862286>1_514208723e1_51420882485868?87>4_5142089258?89>2_514208:268:>1_514208;278:8988>3_514208<288?8:8988>4_514208=29888?>2_514208>2:_514208?2;8?8>8;8<8=>5_5148?<0q62:" #(#0#
-  #fn("n20Z;J904200152S:" #(#fn(assq)) top?) #fn("n10H3400:020d3400:0<B3P07105122CF023A<7405151A<0=5162:0<A<0=51P:" #(((begin))
-  caar begin #fn(append) cdar) splice-begin) *expanded* #fn("n20H3400:A<201523:0F<051@300A<2115287;39047286512324758852152b987JA024269289>28662:Ib:8:278:928993>4_48:<^186518:I8;B3c0493<788;51QJC08;92<8;<89<52_@;08;798;51_48;=?;@\xfb/48::" #(begin
-  def get-defined-vars #fn(nconc) #fn(map) list #fn("n1A<0F<62:")
-  #fn("n10H3400:0<B3F02071051C<00<A<0=51P:F<0<92<52922223747585515292<52_493<85PA<0=51P:" #(def
+er-def expand-def λ #fn(nconc) lastcdr #fn(map)) lower-def 11)
+            macrocall? #fn("n10<R;3904700<61:" #(get-syntax) macrocall? 6) macroexpand
+            #fn("n1IIIIIIIIIIIb5b6b7b8b9b:b;b<b=b>b?208521_51420862286>1_514208723e1_51420882485868?87>4_5142089258?89>2_514208:268:>1_514208;278:8988>3_514208<288?8:8988>4_514208=29888?>2_514208>2:_514208?2;8?8>8;8<8=>5_5148?<0q62:" #(#0#
+  #fn("n20Z;J904200152S:" #(#fn(assq)) top? 7) #fn("n10H3400:020d3400:0<B3P07105122CF023A<7405151A<0=5162:0<A<0=51P:" #(((begin))
+  caar begin #fn(append) cdar) splice-begin 8) *expanded* #fn("n20H3400:A<201523:0F<051@300A<2115287;39047286512324758852152b987JA024269289>28662:Ib:8:278:928993>4_48:<^186518:I8;B3c0493<788;51QJC08;92<8;<89<52_@;08;798;51_48;=?;@\xfb/48::" #(begin
+  def get-defined-vars #fn(nconc) #fn(map) list #fn("n1A<0F<62:" 7)
+  #fn("n10H3400:0<B3F02071051C<00<A<0=51P:F<0<92<52922223747585515292<52_493<85PA<0=51P:" #(def
+  caar #fn(nconc) #fn(map) list get-defined-vars) 11) caar cdar) expand-body 14)
 2071051C<00<A<0=51P:F<0<92<52922223747585515292<52_493<85PA<0=51P:" #(def
-fn(map) list get-defined-vars)) caar cdar) expand-body)
+ expand-body 14)
 n20H3400:0<B3R00<=B3K070051A<7105115272051PP@400<F<0=152P:" #(caar cadar cddar) expand-lambda-list)
   #fn("n10H3600e1:0<B3?070051A<0=51P:0<A<0=51P:" #(caar) l-vars)
-522225e1F<868:52e192<888:528764:" #(lastcdr cddr #fn(nconc)
+astcdr cddr #fn(nconc)
 #fn(nconc)
                                                                           #fn(map) list λ) expand-lambda)
   #fn("n20=S;J6040TH3n070051J400:0T71700515187<87=883=072868852@30q42386A<89<152e3:740517505171700515188<88=F<86512627788;52152893?07287898653@30q42623e18792<868<52Pe193<8:8<5263:" #(cddr
   separate-doc-from-body sym-set-doc def cdadr caadr #fn(nconc)
-fn(map) list) expand-define) #fn("n20T20A<71051222324F1>2865215252P:" #(begin cddr #fn(nconc)
+20A<71051222324F1>2865215252P:" #(begin cddr #fn(nconc)
 nconc)
-525150Fe3:" #(compile-thunk))) expand-let-syntax)
-  #fn("n20:" #() local-expansion-env) #fn("n20H3400:0<208615221A10>3873P087=B3I0A<87T0=f2F<72875115262:73051893>0A<890=f2162:87;J?0486RS;J60486Z3708860:8624C400:8625C:092<0162:8626C:093<0162:8627C:094<0162:8860:" #(#fn(assq)
+xpand-let-syntax 12)
+  #fn("n20:" #() local-expansion-env 4) #fn("n20H3400:0<208615221A10>3873P087=B3I0A<87T0=f2F<72875115262:73051893>0A<890=f2162:87;J?0486RS;J60486Z3708860:8624C400:8625C:092<0162:8626C:093<0162:8627C:094<0162:8860:" #(#fn(assq)
+  #fn("n0Ib48420AF84>3_484<^19261:" #(#fn("n10H3400:0<H3700<@90A<0<F5292<0=51P:" 7)) 6) caddr
 24C400:8625C:092<0162:8626C:093<0162:8627C:094<0162:8860:" #(#fn(assq)
-3_484<^19261:" #(#fn("n10H3400:0<H3700<@90A<0<F5292<0=51P:"))) caddr
-  macrocall? quote λ def let-syntax) expand-in)) macroexpand)
-            macroexpand-1 #fn("n10H3400:7005185390850=}2:0:" #(macrocall?) macroexpand-1)
-            make-code-emitter #fn("n0q2050EqEo5:" #(#fn(table)) make-code-emitter)
-            make-perfect-hash-table #fn("n1Ib5208521_514Ib6862285860>3_486<^12305161:" #(#1#
-  #fn("n270712205151162:" #(mod0 abs #fn(hash)) $hash-keyword)
-  #fn("n120r20i2q52Ib68621A085F86>5_486<^19261:" #(#fn(vec-alloc)
-                                                   #fn("n10B3p070051r2A<85F52i29286G3;093<FKM61:928685p49286KM71051p494<0=61:92:" #(caar
-  cdar)))) #fn(length)) make-perfect-hash-table)
+ax) expand-in 12)) macroexpand 18)
+            macroexpand-1 #fn("n10H3400:7005185390850=}2:0:" #(macrocall?) macroexpand-1 7)
+            make-code-emitter #fn("n0q2050EqEEo6:" #(#fn(table)) make-code-emitter 10)
+            make-perfect-hash-table #fn("n1Ib5208521_514Ib6862285860>3_486<^12305161:" #(#1#
+  #fn("n270712205151162:" #(mod0 abs #fn(hash)) $hash-keyword 8)
+  #fn("n120r20i2q52Ib68621A085F86>5_486<^19261:" #(#fn(vec-alloc)
+                                                   #fn("n10B3p070051r2A<85F52i29286G3;093<FKM61:928685p49286KM71051p494<0=61:92:" #(caar
+  cdar) 10)) 7) #fn(length)) make-perfect-hash-table 8)
+            make-system-image #fn("n120021222354247576Dw54Dw64278788>2288685>22989>1{89504:" #(#fn(file)
 #(#fn(file)
--hooks*
-                            *print-pretty* *print-width* *print-readably* *print-level*
-                            *print-length* *os-name* *interactive* *prompt* *os-version* ptr)
-  *print-pretty* *print-readably* #fn("n0Aw04Fw1:" #(*print-pretty* *print-readably*))
-  #fn("n07021A>1722350245252752677842678845253f22985F5242:F7;52^1^142<F61:" #(filter #fn("n10Z;3u0420051S;3j0421051[S;JC0422051222105151dS;3I04230A52S;3=04242105151S:" #(#fn(const?)
-  #fn(top-level-value) #fn(str) #fn(memq) #fn(io?))) sort #fn(environment) #.< nconc #fn(map) list
-                                                                              top-level-value #fn(write)
-                                                                              #fn(io-write)
-                                                                              *linefeed* #fn(io-close)))
+       *print-length* *os-name* *interactive* *prompt* *os-version* ptr)
+  *print-pretty* *print-readably* #fn("n0Aw04Fw1:" #(*print-pretty* *print-readably*) 4)
+  #fn("n07021A>1722350245252752677842678845253f22985F5242:F7;52^1^142<F61:" #(filter #fn("n10Z;3u0420051S;3j0421051[S;JC0422051222105151dS;3I04230A52S;3=04242105151S:" #(#fn(const?)
+  #fn(top-level-value) #fn(str) #fn(memq) #fn(io?)) 8) sort #fn(environment) #.< nconc #fn(map)
+                                                                              list top-level-value
+                                                                              #fn(write)
+                                                                              #fn(io-write)
+                                                                              *linefeed* #fn(io-close)) 12)
+  #fn("n1A50420061:" #(#fn(raise)) 6)) make-system-image 11)
 61:" #(#fn(raise)))) make-system-image)
             map! #fn("n21I1B3B04101<51_41=?1@\x1d/4:" #() map!) map-int
-00015182K~53P:" #(nestlist) nestlist)
+#fn("n10EL2:" #() negative? 6) nestlist #fn("n3E82L2;3B041700015182K~53P:" #(nestlist) nestlist 10)
 " #(*io-out* #fn(io-write)
                                                                    *linefeed* void) newline)
             nreconc #fn("n2701062:" #(reverse!-) nreconc) odd?
             #fn("n170051S:" #(even?) odd?) partition #fn("n2I2021?65148601qe1qe164:" #(#0#
-          #fn("n48283PI1B3Z0401<513?0821<qPN=?2@<0831<qPN=?341=?1@\x05/47088<=88==62:" #(values) partition-)) partition)
+83PI1B3Z0401<513?0821<qPN=?2@<0831<qPN=?341=?1@\x05/47088<=88==62:" #(values) partition- 8)) partition 10)
 62:" #(values) partition-)) partition)
             positive? #fn("n1E0L2:" #() positive?) princ
             #fn("z070qw042185>1220>12386>1{86504:" #(*print-readably* #fn("n0Aw0:" #(*print-readably*))
@@ -406,121 +413,121 @@
                                                      #fn("n1A50420061:" #(#fn(raise)))) princ)
             print #fn("z02071062:" #(#fn(for-each) write) print) print-exception
             #fn("n170051;3N04700<51;3C04217205151;35040<853700=@30086;3?0486<R;360486<87;360486=853O0732485<512585T257685512756@30q48728C\x84073295147:88r252360q@A07388<2752488=?842;2<7=8851524732>88<2?2@88T51275547A88T51@M1872BCH0732C88T2D5347A88<51@01872EC@0732F88<2G53@\x1b0872HCB0732I5147388f2@\x040872JC?07K88<514I:@\xf00872LCB0732M5147388f2@\xd90872NCB0732O5147388f2@\xc20872PC>0732Q88<52@\xaf0872RCR0732S88<513702T@402U5147A88<51@\x880872VCB0732W5147388f2@q0872XCB0732Y5147388f2@Z0872ZQ;J804872[Q3;07388f2@?0732\\5147A865147]60:" #(list?
-512585T257685512756@30q48728C\x84073295147:88r252360q@A07388<2752488=?842;2<7=8851524732>88<2?2@88T51275547A88T51@M1872BCH0732C88T2D5347A88<51@01872EC@0732F88<2G53@\x1b0872HCB0732I5147388f2@\x040872JC?07K88<514I:@\xf00872LCB0732M5147388f2@\xd90872NCB0732O5147388f2@\xc20872PC>0732Q88<52@\xaf0872RCR0732S88<513702T@402U5147A88<51@\x880872VCB0732W5147388f2@q0872XCB0732Y5147388f2@Z0872ZQ;J804872[Q3;07388f2@?0732\\5147A865147]60:" #(list?
+5T257685512756@30q48728C\x84073295147:88r252360q@A07388<2752488=?842;2<7=8851524732>88<2?2@88T51275547A88T51@M1872BCH0732C88T2D5347A88<51@01872EC@0732F88<2G53@\x1b0872HCB0732I5147388f2@\x040872JC?07K88<514I:@\xf00872LCB0732M5147388f2@\xd90872NCB0732O5147388f2@\xc20872PC>0732Q88<52@\xaf0872RCR0732S88<513702T@402U5147A88<51@\x880872VCB0732W5147388f2@q0872XCB0732Y5147388f2@Z0872ZQ;J804872[Q3;07388f2@?0732\\5147A865147]60:" #(list?
 347A88<51@01872EC@0732F88<2G53@\x1b0872HCB0732I5147388f2@\x040872JC?07K88<514I:@\xf00872LCB0732M5147388f2@\xd90872NCB0732O5147388f2@\xc20872PC>0732Q88<52@\xaf0872RCR0732S88<513702T@402U5147A88<51@\x880872VCB0732W5147388f2@q0872XCB0732Y5147388f2@Z0872ZQ;J804872[Q3;07388f2@?0732\\5147A865147]60:" #(list?
-88f2@\xd90872NCB0732O5147388f2@\xc20872PC>0732Q88<52@\xaf0872RCR0732S88<513702T@402U5147A88<51@\x880872VCB0732W5147388f2@q0872XCB0732Y5147388f2@Z0872ZQ;J804872[Q3;07388f2@?0732\\5147A865147]60:" #(list?
+872NCB0732O5147388f2@\xc20872PC>0732Q88<52@\xaf0872RCR0732S88<513702T@402U5147A88<51@\x880872VCB0732W5147388f2@q0872XCB0732Y5147388f2@Z0872ZQ;J804872[Q3;07388f2@?0732\\5147A865147]60:" #(list?
 732W5147388f2@q0872XCB0732Y5147388f2@Z0872ZQ;J804872[Q3;07388f2@?0732\\5147A865147]60:" #(list?
-c #fn(io-filename) ":" caddr ": " type-error "type error: " length= #fn(for-each)
-  #fn("n17002162:" #(princ ": ")) cddr "expected " ", got " #fn(type-of) print bounds-error "index "
+ame) ":" caddr ": " type-error "type error: " length= #fn(for-each)
+  #fn("n17002162:" #(princ ": ") 7) cddr "expected " ", got " #fn(type-of) print bounds-error "index "
 unds-error "index "
-t-exception parse-error "parsing error: " arg-error "arguments error: " key-error "key not found: "
-  const-error #fn(keyword?) "keywords are read-only: "
+rror "parsing error: " arg-error "arguments error: " key-error "key not found: "
+  const-error #fn(keyword?) "keywords are read-only: "
 rd?) "keywords are read-only: "
   "tried to modify a constant: " io-error "I/O error: " assert-failed "assertion failed: "
--error "*** Unhandled exception: " newline) print-exception)
-            print-stack-trace #fn("n1IIb5b620852185>1_51420862285>1_5147374252627505252Eb82829868788>37:05162:" #(#0#
-  #fn("n32005182P2105121151C?022232487e361:25051E76278851512888A187>4|:" #(#fn(fn-name)
+ption: " newline) print-exception 15)
+            print-stack-trace #fn("n1IIb5b620852185>1_51420862285>1_5147374252627505252Eb82829868788>37:05162:" #(#0#
+  #fn("n32005182P2105121151C?022232487e361:25051E76278851512888A187>4|:" #(#fn(fn-name)
                                                            #fn(fn-code)
                                                                            #fn(raise) thrown-value
-                                                 ffound #fn(fn-vals) 1-
-                                                                           #fn(length)
-                                                                           #fn("n170A0G513>0F<A0G929363:q:" #(closure?))) find-in-f)
-  #fn("n220A01>321{863E0722374758651522662:0[38027061:28:" #(#fn("n02021AF>292524q:" #(#fn(for-each)
-                                                                                       #fn("n1A<0Fq63:")))
+                    ffound #fn(fn-vals) 1-
+                                                                           #fn(length)
+                                                                           #fn("n170A0G513>0F<A0G929363:q:" #(closure?) 8)) find-in-f 10)
+  #fn("n220A01>321{863E0722374758651522662:0[38027061:28:" #(#fn("n02021AF>292524q:" #(#fn(for-each)
+                                                                                       #fn("n1A<0Fq63:" 8)) 7)
                                                              #fn("n1A<0Fq63:")))
-                                        #fn("n10B3F00<20C?00T21C8072061:23061:" #(thrown-value
+         #fn("n10B3F00<20C?00T21C8072061:23061:" #(thrown-value
              #fn("n10B3F00<20C?00T21C8072061:23061:" #(thrown-value
-ffound caddr #fn(raise))) str-join #fn(map) str reverse! "/" #fn(fn-name) "λ") fname) filter
+n #fn(map) str reverse! "/" #fn(fn-name) "λ") fname 10) filter
 me) filter
-) #fn(for-each) #fn("n17021A<0KGF52524r2722305151240>1|470257652492<El23?0770KG0EG52@30q49292<KM_:" #(princ
+GF52524r2722305151240>1|470257652492<El23?0770KG0EG52@30q49292<KM_:" #(princ
   "(" 1- #fn(length) #fn("n1702151472A0G61:" #(princ " " print)) ")" *linefeed* fn-disasm))
-rse!) print-stack-trace)
+          print-to-str #fn("z02050212285>10524238561:" #(#fn(buffer)
 n(buffer)
                                                            #fn(for-each)
                                                            #fn("n1200A62:" #(#fn(write)))
-@F02250237118853488?7^14238708253482:" #(#fn(get)
-                                                                                  *properties* #fn(table)
-                                                                                  #fn(put!)) putprop)
-            quote-value #fn("n1700513400:210e2:" #(self-evaluating? quote) quote-value) quoted?
-            #fn("n10<20Q:" #(quote) quoted?) random #fn("n1200513<0712250062:23500i2:" #(#fn(int?)
-  mod #fn(rand) #fn(rand-double)) random)
-            read-all #fn("n17071062:" #(read-all-of read) read-all) read-all-of
-            #fn("n2Ib686201860>3_486<^1q015162:" #(#fn("n220A5138071061:F<10P92A5162:" #(#fn(io-eof?)
-  reverse!))) read-all-of)
+4238708253482:" #(#fn(get)
+                                                                                  *properties* #fn(table)
+                                                                                  #fn(put!)) putprop 10)
+            quote-value #fn("n1700513400:210e2:" #(self-evaluating? quote) quote-value 6) quoted?
+            #fn("n10<20Q:" #(quote) quoted? 6) random #fn("n1200513<0712250062:23500i2:" #(#fn(int?)
+  mod #fn(rand) #fn(rand-double)) random 7)
+            read-all #fn("n17071062:" #(read-all-of read) read-all 7) read-all-of
+            #fn("n2Ib686201860>3_486<^1q015162:" #(#fn("n220A5138071061:F<10P92A5162:" #(#fn(io-eof?)
+  reverse!) 8)) read-all-of 8)
 -s16-LE)
-                                                                                      #fn(ash)) ref-s32-LE)
+                                                     #fn(ash)) ref-s32-LE 12)
                                 #fn(ash)) ref-s32-LE)
             remprop #fn("n220711q5386;3F042286052;3:042386062:" #(#fn(get) *properties* #fn(has?)
                                                                   #fn(del!)) remprop)
-                                                                    *io-out* #0#
-                                                                                   #fn("n02021{227351S;3q047484517585513M07584513@076504277851@30q@=079855147:5047;85w<61:" #(#fn("n0207122D63:" #(#fn(read)
-  *io-in* :whitespace)) #fn("n1207151422061:" #(#fn(io-discardbuffer) *io-in* #fn(raise)))
+                                      *io-out* #0#
+                                                                                   #fn("n02021{227351S;3q047484517585513M07584513@076504277851@30q@=079855147:5047;85w<61:" #(#fn("n0207122D63:" #(#fn(read)
+  *io-in* :whitespace) 8) #fn("n1207151422061:" #(#fn(io-discardbuffer) *io-in* #fn(raise)) 6)
 o-in* :whitespace)) #fn("n1207151422061:" #(#fn(io-discardbuffer) *io-in* #fn(raise)))
   #fn(io-eof?) *io-in* load-process void? *prompt* #fn(io-flush) *io-out* print newline void that) prompt)
-                                            #fn("n020A>121{370F<60:q:" #(#fn("n0A<60:")
+             #fn("n020A>121{370F<60:q:" #(#fn("n0A<60:" 5)
 n1700514D:" #(top-level-exception-handler))) reploop) newline) repl)
-#(reverse-) revappend) reverse
+
 0q062:" #(reverse-) reverse) reverse! #fn("n170q062:" #(reverse!-) reverse!)
             reverse!- #fn("n2I1B3B041=101?04N4?1@\x1d/40:" #() reverse!-) reverse-
             #fn("n21J400:701<0P1=62:" #(reverse-) reverse-) rune? #fn("n12005121Q:" #(#fn(type-of)
-                                                                                   rune) rune?)
-            self-evaluating? #fn("n120051S;3Z040H;36040RS;JK0421051;3A040R;3:04022051Q:" #(#fn(gensym?)
-  #fn(const?) #fn(top-level-value)) self-evaluating?)
+                                                             rune) rune? 6)
+            self-evaluating? #fn("n120051S;3Z040H;36040RS;JK0421051;3A040R;3:04022051Q:" #(#fn(gensym?)
+  #fn(const?) #fn(top-level-value)) self-evaluating? 7)
 W1000J60q?14I2021?65140<0=2287513F01JB0883=07388871P62:13X02487513O086258751513B07388=8788<P1P62:761510P:" #(#0#
-P:" #(#0#
+1L2;3i04210K5222Q;3[04210r25223Q;3L04210r35224Q;3=04210r45225Q:" #(#fn(str-length)
 =04210r45225Q:" #(#fn(str-length)
-)
-                                                                                  #\d #\o #\c #\-) doc?)
-  #fn(str?) separate-doc-from-body #fn(keyword?) #fn(str) reverse) separate-doc-from-body)
+                                                        #\d #\o #\c #\-) doc? 7)
+  #fn(str?) separate-doc-from-body #fn(keyword?) #fn(str) reverse) separate-doc-from-body 11)
+            set-syntax! #fn("n220710163:" #(#fn(put!) *syntax-environment*) set-syntax! 8) sort
       set-syntax! #fn("n220710163:" #(#fn(put!) *syntax-environment*) set-syntax!) sort
             #fn("O200010003000W2000J7071?240=J400:0<7223182870>42418287>362:" #(#(:key 0) identity
-                    call-with-values #fn("n07021AF92>393=62:" #(partition
-  #fn("n1AF051F925162:"))) #fn("n220710A22F5492e1711A22F5463:" #(#fn(nconc) sort :key))) sort)
-            splice-form? #fn("n10B;3X040<20Q;JN040<21Q;JD040<22Q;3:04730r252;J704022Q:" #(unquote-splicing
+-values #fn("n07021AF92>393=62:" #(partition
+  #fn("n1AF051F925162:" 8)) 7) #fn("n220710A22F5492e1711A22F5463:" #(#fn(nconc) sort :key) 12)) sort 8)
+            splice-form? #fn("n10B;3X040<20Q;JN040<21Q;JD040<22Q;3:04730r252;J704022Q:" #(unquote-splicing
 ote length>) splice-form?)
-fn(buffer)
+                                                         #fn(io-write)
                                                            #fn(for-each)
                                                                          #fn("n120AF52420A062:" #(#fn(io-write)))
-       str-lpad #fn("n3207182122051~52062:" #(#fn(str) str-rep #fn(str-length)) str-lpad)
-            str-map #fn("n2205021151EI8887L23O0422860231885251524748851?8@\f/^14258661:" #(#fn(buffer)
-  #fn(str-length) #fn(io-putrune) #fn(str-rune) 1+ #fn(io->str)) str-map)
+182122051~52062:" #(#fn(str) str-rep #fn(str-length)) str-lpad 10)
+            str-map #fn("n2205021151EI8887L23O0422860231885251524748851?8@\f/^14258661:" #(#fn(buffer)
+  #fn(str-length) #fn(io-putrune) #fn(str-rune) 1+ #fn(io->str)) str-map 13)
 r)) str-map)
-ail #fn("n2200162:" #(#fn(str-sub)) str-tail) str-trim
+(str-sub)) str-tail 7) str-trim
 82288>1_5142305124087<01E895488<082895363:" #(#0#
-                            #fn("n48283L23P02012108252523A0A<017282518364:82:" #(#fn(str-find)
-  #fn(str-rune) 1+) trim-start) #fn("n3E82L23R020121072825152523?0A<0172825163:82:" #(#fn(str-find)
-                                                                                      #fn(str-rune)
-                                                                                      1-) trim-end)
+   #fn("n48283L23P02012108252523A0A<017282518364:82:" #(#fn(str-find)
+  #fn(str-rune) 1+) trim-start 9) #fn("n3E82L23R020121072825152523?0A<0172825163:82:" #(#fn(str-find)
+                                                                                        #fn(str-rune)
                                                           1-) trim-end)
                                                                                         #fn(str-length)
-                      #fn(str-length)
+                                                                                    #fn(str-length)
                           #fn(str-sub)) str-trim)
             subseq #fn("\x8720003000W2000J60q?24IIb77007115152360q@90722315247418252360q@=07225182e252482;3L0470071825152S;3;0472268252427872882187>3_51427298201>3?85147:0513:087<0162:0]390887;61:7<0513C02=051T882>89>161:q:" #(length>
-07225182e252482;3L0470071825152S;3;0472268252427872882187>3_51427298201>3?85147:0513:087<0162:0]390887;61:7<0513C02=051T882>89>161:q:" #(length>
+0003000W2000J60q?24IIb77007115152360q@90722315247418252360q@=07225182e252482;3L0470071825152S;3;0472268252427872882187>3_51427298201>3?85147:0513:087<0162:0]390887;61:7<0513C02=051T882>89>161:q:" #(length>
 ;61:7<0513C02=051T882>89>161:q:" #(length>
- "start" <= "start <= end" "end" #0#
+:7<0513C02=051T882>89>161:q:" #(length>
 0=7115162:" #(copy-list 1-) subseq-l)
-92~5192718551228692F>3|486:" #(#fn(length) 1- #fn("n1A0F~920Gp:")) subseq-av)
+2:" #(copy-list 1-) subseq-l 8)
 v)
-arr-alloc)))) subseq)
-            sym-set-doc #fn("z2Ib720872187>1_51422151883601@401<88360q@401=2387<825224Z3\xb40893\xaf0258926528<<8<=77288>528?;3H04298?51297:8?2;2<5351~8?;3?04232=8@>18>52748=8AP26527>02?8B5348:3>07>02@8:53@30q^1^1^1^1^1^1^1@30q48;B3[07A02B527C2D8<>18;527>02B2E8<8=5253^1^1@30q47F60:" #(#0#
+st? vec-alloc arr? #fn(type-of) #fn("n120A0E63:" #(#fn(arr-alloc)) 8)) subseq 10)
+            sym-set-doc #fn("z2Ib720872187>1_51422151883601@401<88360q@401=2387<825224Z3\xb40893\xaf0258926528<<8<=77288>528?;3H04298?51297:8?2;2<5351~8?;3?04232=8@>18>52748=8AP26527>02?8B5348:3>07>02@8:53@30q^1^1^1^1^1^1^1@30q48;B3[07A02B527C2D8<>18;527>02B2E8<8=5253^1^1@30q47F60:" #(#0#
 ?51297:8?2;2<5351~8?;3?04232=8@>18>52748=8AP26527>02?8B5348:3>07>02@8:53@30q^1^1^1^1^1^1^1@30q48;B3[07A02B527C2D8<>18;527>02B2E8<8=5253^1^1@30q47F60:" #(#0#
-07A02B527C2D8<>18;527>02B2E8<8=5253^1^1@30q47F60:" #(#0#
+527>02?8B5348:3>07>02@8:53@30q^1^1^1^1^1^1^1@30q48;B3[07A02B527C2D8<>18;527>02B2E8<8=5253^1^1@30q47F60:" #(#0#
 085A<0=51P:" #(length> subseq) formals-clean)
-5222Q;34040:" #(#fn(str-length)
+-join #fn(str-split) "\n" any #fn("n1E20051L2;3B04210E5222Q;34040:" #(#fn(str-length)
 2390220A62:0:" #(<= #fn(length)
-(str-sub)))
+tra* getprop *formals-list* filter #fn("n1700A52S:" #(member) 7)
 ))
-                                     #fn(table-foldl)
-                                                       #fn("n320A0163:" #(#fn(put!)))) table-clone)
+    #fn(table-foldl)
+                                                       #fn("n320A0163:" #(#fn(put!)) 8)) table-clone 9)
 fn("n320A0163:" #(#fn(put!)))) table-clone)
-                                                 #fn(table-foldl)
-                                                        #fn("n320A1063:" #(#fn(put!)))) table-invert)
+              #fn(table-foldl)
+                                                        #fn("n320A1063:" #(#fn(put!)) 8)) table-invert 9)
 invert)
-(table-foldl)
-                                           #fn("n3082P:")) table-keys)
-            table-pairs #fn("n12021q063:" #(#fn(table-foldl)
+                      #fn("n3082P:" 6)) table-keys 8)
+            table-pairs #fn("n12021q063:" #(#fn(table-foldl)
+                                            #fn("n301P82P:" 6)) table-pairs 8)
+            table-values #fn("n12021q063:" #(#fn(table-foldl)
 foldl)
-               #fn("n3182P:")) table-values)
-            to-proper #fn("n10J400:0H3600e1:0<700=51P:" #(to-proper) to-proper)
-            top-level-exception-handler #fn("n17071w042285>1230>12486>1{86504:" #(*io-out* *stderr*
+00:0H3600e1:0<700=51P:" #(to-proper) to-proper 7)
+            top-level-exception-handler #fn("n17071w042285>1230>12486>1{86504:" #(*io-out* *stderr*
+                                                                                  #fn("n0Aw0:" #(*io-out*) 4)
--- a/src/compiler.sl
+++ b/src/compiler.sl
@@ -1,13 +1,18 @@
 ;;;; built-in compiler
 
 ;; code generation state, constant tables, bytecode encoding
-(def (make-code-emitter) (vec NIL (table) 0 NIL 0))
+(def (make-code-emitter) (vec NIL (table) 0 NIL 0 0))
 (defmacro (bcode:code   b) `(aref ,b 0))
 (defmacro (bcode:ctable b) `(aref ,b 1))
 (defmacro (bcode:nconst b) `(aref ,b 2))
 (defmacro (bcode:cenv   b) `(aref ,b 3))
 (defmacro (bcode:sp     b) `(aref ,b 4))
-(defmacro (bcode:stack  b n) `(aset! ,b 4 (+ (bcode:sp ,b) ,n)))
+(defmacro (bcode:spmax  b) `(aref ,b 5))
+(def (bcode:stack b n)
+  (let ((sp (+ (bcode:sp b) n)))
+    (when (> sp (bcode:spmax b))
+      (aset! b 5 sp))
+    (aset! b 4 sp)))
 
 (def (compile-error . rest)
   (apply error (cons "compile error: " rest)))
@@ -745,7 +750,8 @@
     (when opta
       (emit-optional-arg-inits g env opta vars nreq))
 
-    (let* {[bpvars (if suppl ; "supplied?" are placed at the current frame start
+    (let* {[args vars]
+           [bpvars (if suppl ; "supplied?" are placed at the current frame start
                        (append vars '(nil nil nil nil) suppl)
                        vars)]
            [vars (if suppl (append vars suppl) vars)]
@@ -752,13 +758,14 @@
            [newenv (extend-env env bpvars (complex-bindings (lambda:body f) vars))]}
       (box-vars g (car newenv))
       ;; set initial stack pointer
-      (aset! g 4 (+ (length vars) 4))
+      (bcode:stack g (+ (length vars) 4))
       ;; compile body and return
       (compile-in g newenv T (lambda:body f))
       (emit g 'ret)
       (values (fn (encode-byte-code (bcode:code g))
                   (const-to-idx-vec g)
-                  name)
+                  name
+                  (- (bcode:spmax g) (length args)))
               (bcode:cenv g)))))
 
 ;; disassembler
--- a/src/maxstack.h
+++ /dev/null
@@ -1,171 +1,0 @@
-#if BYTE_ORDER == BIG_ENDIAN
-#undef SWAP_INT32
-#undef SWAP_INT16
-#define SWAP_INT32(a) \
-	do{ \
-		uint8_t *x = (void*)a, y; \
-		y = x[0]; x[0] = x[3]; x[3] = y; \
-		y = x[1]; x[1] = x[2]; x[2] = y; \
-	}while(0)
-#define SWAP_INT16(a) \
-	do{ \
-		uint8_t *x = (void*)a, y; \
-		y = x[0]; x[0] = x[1]; x[1] = y; \
-	}while(0)
-#else
-#define SWAP_INT32(a)
-#define SWAP_INT16(a)
-#endif
-
-sl_purefn
-static int
-compute_maxstack(u8int *code, usize len)
-{
-	u8int *ip = code, *end = code+len;
-	int i, n, sp = 0, maxsp = 0;
-
-	while(ip < end){
-		sl_op op = *ip++;
-		switch(op){
-		case OP_LOADA: case OP_LOADI8: case OP_LOADV: case OP_LOADG:
-			ip++; // fallthrough
-		case OP_LOADA0: case OP_LOADA1:
-		case OP_DUP: case OP_LOADT: case OP_LOADNIL: case OP_LOADVOID:
-		case OP_LOAD0:
-		case OP_LOAD1: case OP_LOADC0:
-		case OP_LOADC1:
-			sp++;
-			break;
-
-		case OP_POP: case OP_RET:
-		case OP_CONS: case OP_SETCAR: case OP_SETCDR:
-		case OP_EQP: case OP_EQVP: case OP_EQUALP: case OP_ADD2: case OP_SUB2:
-		case OP_DIV0: case OP_COMPARE:
-		case OP_AREF2: case OP_TRYCATCH:
-			sp--;
-			break;
-
-		case OP_AREF:
-			n = 2 + *ip++;
-			sp -= n;
-			break;
-
-		case OP_ARGC: case OP_SETG: case OP_SETA: case OP_BOX:
-			ip++;
-			continue;
-
-		case OP_TCALL: case OP_CALL: case OP_CLOSURE: case OP_SHIFT:
-			n = *ip++;  // nargs
-			sp -= n;
-			break;
-
-		case OP_LOADVL: case OP_LOADGL: case OP_LOADAL:
-			sp++; // fallthrough
-		case OP_SETGL: case OP_SETAL: case OP_ARGCL: case OP_BOXL:
-			SWAP_INT32(ip);
-			ip += 4;
-			break;
-
-		case OP_LOADC:
-			sp++;
-			ip++;
-			break;
-
-		case OP_VARGC:
-			n = *ip++;
-			sp += n+2;
-			break;
-		case OP_VARGCL:
-			SWAP_INT32(ip);
-			n = GET_S32(ip); ip += 4;
-			sp += n+2;
-			break;
-		case OP_OPTARGS:
-			SWAP_INT32(ip);
-			i = GET_S32(ip); ip += 4;
-			SWAP_INT32(ip);
-			n = abs(GET_S32(ip)); ip += 4;
-			sp += n-i;
-			break;
-		case OP_KEYARGS:
-			SWAP_INT32(ip);
-			i = GET_S32(ip); ip += 4;
-			SWAP_INT32(ip);
-			ip += 4;
-			SWAP_INT32(ip);
-			n = abs(GET_S32(ip)); ip += 4;
-			sp += n-i;
-			break;
-		case OP_BOUNDA:
-			SWAP_INT32(ip);
-			ip += 4;
-			sp++;
-			break;
-		case OP_TCALLL: case OP_CALLL:
-			SWAP_INT32(ip);
-			n = GET_S32(ip); ip+=4;
-			sp -= n;
-			break;
-		case OP_JMP:
-			SWAP_INT16(ip);
-			ip += 2;
-			continue;
-		case OP_JMPL:
-			SWAP_INT32(ip);
-			ip += 4;
-			continue;
-		case OP_BRNE:
-			SWAP_INT16(ip);
-			ip += 2;
-			sp -= 2;
-			break;
-		case OP_BRNEL:
-			SWAP_INT32(ip);
-			ip += 4;
-			sp -= 2;
-			break;
-		case OP_BRNN: case OP_BRN:
-			SWAP_INT16(ip);
-			ip += 2;
-			sp--;
-			break;
-		case OP_BRNNL: case OP_BRNL:
-			SWAP_INT32(ip);
-			ip += 4; // fallthrough
-		case OP_TAPPLY: case OP_APPLY:
-		case OP_LIST: case OP_ADD: case OP_SUB: case OP_MUL: case OP_DIV:
-		case OP_VEC: case OP_LT: case OP_NUMEQP:
-			n = *ip++;
-			sp -= n-1;
-			break;
-
-		case OP_FOR:
-			if(maxsp < sp+2)
-				maxsp = sp+2; // fallthrough
-		case OP_ASET:
-			sp -= 2;
-			break;
-
-		case OP_LOADCL:
-			sp++; // fallthrough
-			SWAP_INT32(ip);
-			ip += 4;
-			break;
-
-		case OP_CAR: case OP_CDR: case OP_CADR:
-		case OP_NOT: case OP_NEG: case OP_NUMP:
-		case OP_CONSP: case OP_ATOMP: case OP_SYMP:
-		case OP_FIXNUMP: case OP_BOUNDP: case OP_BUILTINP:
-		case OP_FNP: case OP_VECP: case OP_NANP:
-			continue;
-
-		case N_OPCODES:
-			return -1;
-		}
-		if((s32int)sp > (s32int)maxsp)
-			maxsp = sp;
-	}
-	assert(ip == end);
-	assert(maxsp >= 0);
-	return maxsp+4;
-}
--- a/src/print.c
+++ b/src/print.c
@@ -480,6 +480,8 @@
 						sl_print_child(f, fn->name);
 					}
 				}
+				outc(f, ' ');
+				sl_print_child(f, fixnum(fn->maxstack));
 				outc(f, ')');
 			}else{
 				outs(f, "#<fn>");
--- a/src/sl.c
+++ b/src/sl.c
@@ -877,8 +877,6 @@
 #define GET_S16(a) (s16int)((a)[0]<<0 | (a)[1]<<8)
 #endif
 
-#include "maxstack.h"
-
 /*
   stack on entry: <fn> <nargs args...>
   caller's responsibility:
@@ -984,47 +982,51 @@
 {
 	if(nargs == 1 && issym(args[0]))
 		return fn_builtin_builtin(args, nargs);
-	if(nargs < 1 || nargs > 4)
+	if(nargs < 1 || nargs > 5)
 		argcount(nargs, 1);
-	if(sl_unlikely(!isstr(args[0])))
-		bthrow(type_error("code", "str", args[0]));
-	sl_v vals = sl_emptyvec;
-	if(nargs > 1){
-		vals = args[1];
-		if(sl_unlikely(!isvec(vals)))
-			bthrow(type_error("vals", "vec", vals));
-	}
-	sl_cv *arr = ptr(args[0]);
-	cv_pin(arr);
-	u8int *data = cv_data(arr);
-	usize sz = cv_len(arr);
-	if(slg.loading){
-		// read syntax, shifted 48 for compact text representation
-		for(usize i = 0; i < sz; i++)
-			data[i] -= 48;
-	}
 	sl_fn *fn = alloc_words(sizeof(sl_fn)/sizeof(sl_v));
 	sl_v fv = tagptr(fn, TAG_FN);
-	fn->bcode = args[0];
-	fn->vals = vals;
+	fn->bcode = sl_emptystr;
+	fn->vals = sl_emptyvec;
 	fn->env = sl_nil;
 	fn->name = sl_lambda;
-	fn->maxstack = compute_maxstack(data, sz);
-	if(nargs > 2){
-		if(issym(args[2])){
-			fn->name = args[2];
-			if(nargs > 3)
-				fn->env = args[3];
-		}else{
-			fn->env = args[2];
-			if(nargs > 3){
-				if(sl_unlikely(!issym(args[3])))
-					bthrow(type_error("name", "sym", args[3]));
-				fn->name = args[3];
+	fn->maxstack = ~(usize)0;
+	u8int *data = nil;
+	usize sz = 0;
+	bool envset = false, valsset = false, nameset = false, maxstackset = false, bcodeset = false;
+	for(int i = 0; nargs > i; i++){
+		sl_v v = args[i];
+		if(!envset && (v == sl_nil || (valsset && isvec(v)))){
+			envset = true;
+			fn->env = v;
+		}else if(!valsset && isvec(v)){
+			valsset = true;
+			fn->vals = v;
+		}else if(!nameset && issym(v)){
+			if(sl_unlikely(isgensym(v)))
+				bthrow(lerrorf(sl_errarg, "name cannot be a gensym"));
+			nameset = true;
+			fn->name = v;
+		}else if(!maxstackset && isfixnum(v)){
+			if(sl_unlikely(numval(v) < 0))
+				bthrow(lerrorf(sl_errarg, "invalid maxstack value"));
+			maxstackset = true;
+			fn->maxstack = numval(v);
+		}else if(!bcodeset && isstr(v)){
+			bcodeset = true;
+			sl_cv *arr = ptr(v);
+			cv_pin(arr);
+			data = cv_data(arr);
+			sz = cv_len(arr);
+			if(slg.loading){
+				// read syntax, shifted 48 for compact text representation
+				for(usize j = 0; j < sz; j++)
+					data[j] -= 48;
 			}
+			fn->bcode = v;
+		}else{
+			bthrow(lerrorf(sl_errarg, "unexpected argument type"));
 		}
-		if(sl_unlikely(isgensym(fn->name)))
-			bthrow(lerrorf(sl_errarg, "name must not be a gensym"));
 	}
 	return fv;
 }