Skip to content

Commit 6b8a316

Browse files
that inference was bugged
1 parent c24ec0a commit 6b8a316

File tree

1 file changed

+18
-12
lines changed

1 file changed

+18
-12
lines changed

SRC/std-infer-expr.lsts

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -87,29 +87,35 @@ let std-infer-expr(tctx: Maybe<TContext>, term: AST, is-scoped: Bool, used: IsUs
8787
Typedef{} => ();
8888
AType{tt=tt} => ascript-normal(term, tt);
8989
Seq{} => (
90-
let seqs = [] :: List<AST>;
91-
let is-diff = false as U64;
90+
let seqs = mk-vector(type(AST));
9291
while term.is-seq { match term {
9392
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));
9897
);
9998
}};
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+
};
100107
if is-diff {
101108
term = ASTEOF;
102-
for r in seqs {
109+
let def-order-i = seqs.length - 1;
110+
while def-order-i > 0 {
103111
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;
106115
};
107116
}
108117
);
109118
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);
113119
let rough-tt = typeof(term);
114120
if rough-tt.is-arrow && not(rough-tt.is-open) {
115121
(_, let new-val) = std-infer-expr(tctx, val, is-scoped, Used, TAny);

0 commit comments

Comments
 (0)