|
|
@ -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); |
|
|
|