|
@ -152,8 +152,8 @@ assert((0b1110 & 0b0111) == 0b0110); |
|
|
nt = 0; |
|
|
nt = 0; |
|
|
nf = 0; |
|
|
nf = 0; |
|
|
|
|
|
|
|
|
t() { nt = nt + 1; #t } |
|
|
|
|
|
f() { nf = nf + 1; nil } |
|
|
|
|
|
|
|
|
t() { global nt += 1; #t } |
|
|
|
|
|
f() { global nf += 1; nil } |
|
|
|
|
|
|
|
|
refute(f() || f()); assert(nt == 0); assert(nf == 2); |
|
|
refute(f() || f()); assert(nt == 0); assert(nf == 2); |
|
|
assert(f() || t()); assert(nt == 1); assert(nf == 3); |
|
|
assert(f() || t()); assert(nt == 1); assert(nf == 3); |
|
@ -388,16 +388,23 @@ factorial(n) { if (n < 2) nil else n * factorial(n-1) } |
|
|
|
|
|
|
|
|
typeName(x) { |
|
|
typeName(x) { |
|
|
if (!x) return "<Undefined>"; |
|
|
if (!x) return "<Undefined>"; |
|
|
let name = "?"; |
|
|
|
|
|
let level = 1; |
|
|
|
|
|
|
|
|
name = "?"; |
|
|
|
|
|
level = 1; |
|
|
while (x && !x.allKeys().includes(#__name__)) x = x.__delegate__; |
|
|
while (x && !x.allKeys().includes(#__name__)) x = x.__delegate__; |
|
|
if (x.allKeys().includes(#__name__)) name = x.__name__.asString(); |
|
|
if (x.allKeys().includes(#__name__)) name = x.__name__.asString(); |
|
|
"<" * level + name + ">" * level; |
|
|
"<" * level + name + ">" * level; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
pad(w, i) { |
|
|
|
|
|
while (len(i) < w) i = " " + i; |
|
|
|
|
|
i; |
|
|
|
|
|
|
|
|
backtrace(e) { |
|
|
|
|
|
pad(w, i) { |
|
|
|
|
|
while (len(i) < w) i = " " + i; |
|
|
|
|
|
i; |
|
|
|
|
|
} |
|
|
|
|
|
w = 2; |
|
|
|
|
|
j = len(e); |
|
|
|
|
|
while ((j /= 10) > 0) { ++w; } // w = 1+log10(j) |
|
|
|
|
|
for (i from len(e) - 1 to 0) |
|
|
|
|
|
print(pad(w, codeString(i)), ": ", codeString(e[i]), "\n"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
try { |
|
|
try { |
|
@ -410,9 +417,5 @@ catch (e) { |
|
|
assert(e.operand1 == 2); |
|
|
assert(e.operand1 == 2); |
|
|
assert(e.operand2 == nil); |
|
|
assert(e.operand2 == nil); |
|
|
print(e.__function__, ": ", e.__kind__, ": ", e.__message__, ": ", typeName(e.operand1), " and ", typeName(e.operand2), "\n"); |
|
|
print(e.__function__, ": ", e.__kind__, ": ", e.__message__, ": ", typeName(e.operand1), " and ", typeName(e.operand2), "\n"); |
|
|
let w = 2; |
|
|
|
|
|
let j = i; |
|
|
|
|
|
while ( (j /= 10) > 0) { ++w; } |
|
|
|
|
|
for (i from len(e) - 1 to 0) |
|
|
|
|
|
print(pad(w, codeString(i)), ": ", codeString(e[i]), "\n"); |
|
|
|
|
|
|
|
|
backtrace(e); |
|
|
} |
|
|
} |