@@ -87,29 +87,35 @@ let std-infer-expr(tctx: Maybe<TContext>, term: AST, is-scoped: Bool, used: IsUs
87
87
Typedef{} => ();
88
88
AType{tt=tt} => ascript-normal(term, tt);
89
89
Seq{} => (
90
- let seqs = [] :: List<AST>;
91
- let is-diff = false as U64;
90
+ let seqs = mk-vector(type(AST));
92
91
while term.is-seq { match term {
93
92
Seq{l=left, r=right} => (
94
- (tctx, let new-r) = std-infer-expr(tctx, r, false, Used, hint );
95
- is-diff = is-diff || not(is(r,new-r));
96
- seqs = cons(new-r,seqs);
97
- term = l ;
93
+ seqs = seqs.push(r );
94
+ if l. is-seq
95
+ then term = l
96
+ else ( term = ASTEOF; seqs = seqs.push(l)) ;
98
97
);
99
98
}};
99
+ let is-diff = false as U64;
100
+ let def-i = seqs.length - 1;
101
+ while def-i > 0 {
102
+ let r = seqs[def-i];
103
+ (_, let new-r) = std-infer-expr(tctx, seqs[def-i], false, Used, hint);
104
+ if not(is(r,new-r)) then { is-diff = true; seqs[def-i] = new-r; };
105
+ def-i = def-i - 1;
106
+ };
100
107
if is-diff {
101
108
term = ASTEOF;
102
- for r in seqs {
109
+ let def-order-i = seqs.length - 1;
110
+ while def-order-i > 0 {
103
111
if non-zero(term)
104
- then term = mk-seq(term, r)
105
- else term = r
112
+ then term = mk-seq(term, seqs[def-order-i])
113
+ else term = seqs[def-order-i];
114
+ def-order-i = def-order-i - 1;
106
115
};
107
116
}
108
117
);
109
118
Glb{key=key, val=val} => (
110
- # TODO: remove after infer-expr.lm is ported
111
- #(tctx, let new-val) = std-infer-expr(tctx, val, false, Used);
112
- #if not(is(val,new-val)) then term = mk-glb(key, val);
113
119
let rough-tt = typeof(term);
114
120
if rough-tt.is-arrow && not(rough-tt.is-open) {
115
121
(_, let new-val) = std-infer-expr(tctx, val, is-scoped, Used, TAny);
0 commit comments