diff --git a/minproto.leg b/minproto.leg index 5589431..bfe1ff4 100644 --- a/minproto.leg +++ b/minproto.leg @@ -1,6 +1,6 @@ # minproto.leg -- minimal prototype langauge for semantic experiments # -# last edited: 2024-05-28 16:25:46 by piumarta on zora-1034.local +# last edited: 2024-05-29 09:06:22 by piumarta on m1mbp %{ ; @@ -985,7 +985,10 @@ intptr_t cmp(oop l, oop r, char *who) { int tl = getType(l), tr = getType(r); if (Integer == tl && Integer == tr) return _integerValue(l) - _integerValue(r); - if (Float == tl || Float == tr) return floatValue(l, who) - floatValue(r, who); + if (Float == tl || Float == tr) { + double ll = floatValue(l, who), rr = floatValue(r, who); + return ll < rr ? -1 : (ll > rr ? 1 : 0); + } if (String == tl && String == tr) { int ll = _get(l, String,length), rr = _get(r, String,length); if (ll == rr) return strncmp(_get(l, String,value), _get(r, String,value), ll); @@ -2485,9 +2488,9 @@ oop Binop_eval(oop exp, oop env) oop *ref = (oop *)(intptr_t)_integerValue(lhs); return *ref = rhs; } - case opPreOr ... opPreMod: { assert(isInteger(lhs)); // ref + case opPreOr ... opPreMod: { oop *ref = (oop *)(intptr_t)_integerValue(lhs); - oop val = *ref; assert(isInteger(rhs)); // delta + oop val = *ref; switch (code) { case opPreOr ... opPreShr: { long l = integerValue(val, binopNames[code]); @@ -2797,7 +2800,8 @@ oop For_eval(oop exp, oop env) oop result = eval(initialise, env2); int n = 0; LOOP(); - if (n++) goto doContinue; + if (n) goto doContinue; + n = 1; for (;;) { if (nil == eval(condition, env2)) break; result = eval(body, env2);