@@ -13371,10 +13371,10 @@
1337113371 (~(put by (direct-checked-gates ds env)) update.parts update-def)
1337213372 =/ templates=ienv
1337313373 (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
13374− =/ scanned=(unit dgscan)
13375− (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
13376− ?~ scanned ~
13377− =. next.initial (dg-next-id ids.u.scanned 0)
13374+ =/ fresh=(unit @ud)
13375+ (ienv-fresh-id (weld env (weld values.u.prelude.initial templates)))
13376+ ?~ fresh ~
13377+ =. next.initial u.fresh
1337813378 =/ update-state=istate (reserve-def-caps val.update-def initial)
1337913379 =/ sam=isample-result (infer-sample u.written-update env update-state)
1338013380 ?: ?=(%| -.sam) ~
@@ -13533,10 +13533,10 @@
1353313533 =/ checked=(map term def) (direct-checked-gates ds env)
1353413534 =/ templates=ienv
1353513535 (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
13536− =/ scanned=(unit dgscan)
13537− (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
13538− ?~ scanned ~
13539− =. next.initial (dg-next-id ids.u.scanned 0)
13536+ =/ fresh=(unit @ud)
13537+ (ienv-fresh-id (weld env (weld values.u.prelude.initial templates)))
13538+ ?~ fresh ~
13539+ =. next.initial u.fresh
1354013540 =/ subs-state=istate (reserve-def-caps val.subs-def initial)
1354113541 =/ sam=isample-result (infer-sample u.written-subs env subs-state)
1354213542 ?: ?=(%| -.sam) ~
@@ -13884,10 +13884,10 @@
1388413884 =/ checked=(map term def) (direct-checked-gates ds env)
1388513885 =/ templates=ienv
1388613886 (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
13887− =/ scanned=(unit dgscan)
13888− (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
13889− ?~ scanned ~
13890− =. next.initial (dg-next-id ids.u.scanned 0)
13887+ =/ fresh=(unit @ud)
13888+ (ienv-fresh-id (weld env (weld values.u.prelude.initial templates)))
13889+ ?~ fresh ~
13890+ =. next.initial u.fresh
1389113891 =/ view-state=istate (reserve-def-caps val.view-def initial)
1389213892 =/ sam=isample-result (infer-sample u.written-view env view-state)
1389313893 ?: ?=(%| -.sam) ~
@@ -13998,10 +13998,10 @@
1399813998 =/ checked=(map term def) (direct-checked-gates ds env)
1399913999 =/ templates=ienv
1400014000 (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
14001− =/ scanned=(unit dgscan)
14002− (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
14003− ?~ scanned ~
14004− =. next.initial (dg-next-id ids.u.scanned 0)
14001+ =/ fresh=(unit @ud)
14002+ (ienv-fresh-id (weld env (weld values.u.prelude.initial templates)))
14003+ ?~ fresh ~
14004+ =. next.initial u.fresh
1400514005 =/ view-state=istate (reserve-def-caps val.view-def initial)
1400614006 =/ sam=isample-result (infer-sample u.written-view env view-state)
1400714007 ?: ?=(%| -.sam) ~
@@ -14195,10 +14195,10 @@
1419514195 =/ checked=(map term def) (direct-checked-gates ds env)
1419614196 =/ templates=ienv
1419714197 (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
14198− =/ scanned=(unit dgscan)
14199− (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
14200− ?~ scanned ~
14201− =. next.initial (dg-next-id ids.u.scanned 0)
14198+ =/ fresh=(unit @ud)
14199+ (ienv-fresh-id (weld env (weld values.u.prelude.initial templates)))
14200+ ?~ fresh ~
14201+ =. next.initial u.fresh
1420214202 =/ init-state=istate (reserve-def-caps val.init-def initial)
1420314203 =/ sam=isample-result (infer-sample u.written env init-state)
1420414204 ?: ?=(%| -.sam) ~
@@ -14267,10 +14267,10 @@
1426714267 =/ checked=(map term def) (direct-checked-gates ds env)
1426814268 =/ templates=ienv
1426914269 (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
14270− =/ scanned=(unit dgscan)
14271− (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
14272− ?~ scanned ~
14273− =. next.initial (dg-next-id ids.u.scanned 0)
14270+ =/ fresh=(unit @ud)
14271+ (ienv-fresh-id (weld env (weld values.u.prelude.initial templates)))
14272+ ?~ fresh ~
14273+ =. next.initial u.fresh
1427414274 =/ instance=[typ=itype state=istate] (instantiate-scheme u.program initial)
1427514275 ?. ?=(%fn -.typ.instance) ~
1427614276 ?. ?=(%cell -.sample.typ.instance) ~
@@ -15637,9 +15637,9 @@
1563715637 =/ free=(unit dgscan) (dg-env base ~ 32.768 ~)
1563815638 ?~ free ~
1563915639 ?^ ids.u.free ~
15640− =/ all=(unit dgscan) (dg-all-env-ids base 32.768 ~)
15640+ =/ all=(unit @ud) (ienv-fresh-id base)
1564115641 ?~ all ~
15642− =/ fresh=@ud (dg-next-id ids.u.all 0)
15642+ =/ fresh=@ud u.all
1564315643 =/ st=istate *istate
1564415644 =. st st(next fresh, defer `~, molds molds, globals globals, at at, top-molds (turn molds |=(m=[name=term body=shape] name.m)), in-mold |, jrec-fuel 256)
1564515645 =/ checked-molds=(each imold-types @t) (module-mold-types molds st)
@@ -15679,33 +15679,60 @@
1567915679 =/ free=(unit dgscan) (dg-env all-env ~ 32.768 ~)
1568015680 ?~ free ~
1568115681 ?^ ids.u.free ~
15682− =/ all=(unit dgscan) (dg-all-env-ids all-env 32.768 ~)
15682+ =/ all=(unit @ud) (ienv-fresh-id all-env)
1568315683 ?~ all ~
15684− =/ fresh=@ud (dg-next-id ids.u.all 0)
15684+ =/ fresh=@ud u.all
1568515685 =/ st=istate *istate
1568615686 =. st st(next fresh, defer `~, molds local-molds, globals globals, at at, reserved-molds molds.prepared, prelude prelude, top-molds (turn local-molds |=(m=[name=term body=shape] name.m)), in-mold |, jrec-fuel 256)
1568715687 =/ checked-molds=(each imold-types @t) (module-mold-types local-molds st)
1568815688 ?: ?=(%| -.checked-molds) ~
1568915689 (dg-stage defs base base st ~ 64)
1569015690::
15691−++ dg-all-env-ids
15692− |= [env=ienv fuel=@ud ids=(list @ud)]
15693− ^- (unit dgscan)
15694− ?~ env `[ids fuel]
15695− ?: =(0 fuel) ~
15691+:: +ienv-fresh-id: one above the largest type variable or tag ID in env
15692+::
15693+:: One pass over every ID in env's schemes, quantified or free, so a
15694+:: variable numbered from it captures none of them. A %recursive or
15695+:: %jrec type names its mold and holds no variable, so it is a leaf,
15696+:: and the pass is linear in the size of the types, with no budget.
15697+:: A scheme that still holds an unresolved tag declines.
15698+::
15699+++ ienv-fresh-id
15700+ |= env=ienv
15701+ ^- (unit @ud)
15702+ =/ top=@ud 0
15703+ |-
15704+ ?~ env `+(top)
1569615705 =/ sc=ischeme scheme.i.env
1569715706 ?: (itype-has-tag typ.sc) ~
15698− =/ raw=(unit dgscan) (dg-scan ~[typ.sc] ~ (dec fuel) ids)
15699− ?~ raw ~
15700− =/ quant=(unit dgscan) (dg-scan-ids vars.sc ~ fuel.u.raw ids.u.raw)
15701− ?~ quant ~
15702− $(env t.env, fuel fuel.u.quant, ids ids.u.quant)
15707+ $(env t.env, top (itype-max-id typ.sc (max top (roll vars.sc max))))
15708+::
15709+:: +itype-max-id: the largest variable or tag ID in t, or top
1570315710::
15704−++ dg-next-id
15705− |= [ids=(list @ud) largest=@ud]
15711+++ itype-max-id
15712+ |= [t=itype top=@ud]
15713+ ^- @ud
15714+ ?- -.t
15715+ %var (max top id.t)
15716+ %fvar (max top id.t)
15717+ %avar (max top id.t)
15718+ %rvar (max top id.t)
15719+ %nvar (max top id.t)
15720+ %rnvar (max top id.t)
15721+ %tag (max top id.t)
15722+ ?(%atom %any-atom %flag %noun %empty %const %recursive %jrec) top
15723+ %collection (itype-max-ids args.t top)
15724+ %grec (itype-max-ids args.t top)
15725+ %union (itype-max-ids args.t (itype-max-ids cases.t top))
15726+ %face $(t body.t)
15727+ %fn $(t sample.t, top $(t product.t))
15728+ %cell $(t hed.t, top $(t tal.t))
15729+ ==
15730+::
15731+++ itype-max-ids
15732+ |= [ts=(list itype) top=@ud]
1570615733 ^- @ud
15707− ?~ ids +(largest)
15708− $(ids t.ids, largest (max largest i.ids))
15734+ ?~ ts top
15735+ $(ts t.ts, top (itype-max-id i.ts top))
1570915736::
1571015737++ dg-eligible-ctor
1571115738 |= [e=expr head=itype actual=itype expected=itype state=istate]