mirror of
https://github.com/MorizzG/MLox.git
synced 2025-12-06 04:22:41 +00:00
added lox test files
This commit is contained in:
parent
821f5c62bc
commit
0f3d0a15f0
268 changed files with 7497 additions and 3 deletions
9
lox.t/assignment/associativity.lox
Normal file
9
lox.t/assignment/associativity.lox
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
var a = "a";
|
||||||
|
var b = "b";
|
||||||
|
var c = "c";
|
||||||
|
|
||||||
|
// Assignment is right-associative.
|
||||||
|
a = b = c;
|
||||||
|
print a; // expect: c
|
||||||
|
print b; // expect: c
|
||||||
|
print c; // expect: c
|
||||||
8
lox.t/assignment/global.lox
Normal file
8
lox.t/assignment/global.lox
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
var a = "before";
|
||||||
|
print a; // expect: before
|
||||||
|
|
||||||
|
a = "after";
|
||||||
|
print a; // expect: after
|
||||||
|
|
||||||
|
print a = "arg"; // expect: arg
|
||||||
|
print a; // expect: arg
|
||||||
2
lox.t/assignment/grouping.lox
Normal file
2
lox.t/assignment/grouping.lox
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
var a = "a";
|
||||||
|
(a) = "value"; // Error at '=': Invalid assignment target.
|
||||||
3
lox.t/assignment/infix_operator.lox
Normal file
3
lox.t/assignment/infix_operator.lox
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
var a = "a";
|
||||||
|
var b = "b";
|
||||||
|
a + b = "value"; // Error at '=': Invalid assignment target.
|
||||||
10
lox.t/assignment/local.lox
Normal file
10
lox.t/assignment/local.lox
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
var a = "before";
|
||||||
|
print a; // expect: before
|
||||||
|
|
||||||
|
a = "after";
|
||||||
|
print a; // expect: after
|
||||||
|
|
||||||
|
print a = "arg"; // expect: arg
|
||||||
|
print a; // expect: arg
|
||||||
|
}
|
||||||
2
lox.t/assignment/prefix_operator.lox
Normal file
2
lox.t/assignment/prefix_operator.lox
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
var a = "a";
|
||||||
|
!a = "value"; // Error at '=': Invalid assignment target.
|
||||||
5
lox.t/assignment/syntax.lox
Normal file
5
lox.t/assignment/syntax.lox
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
// Assignment on RHS of variable.
|
||||||
|
var a = "before";
|
||||||
|
var c = a = "var";
|
||||||
|
print a; // expect: var
|
||||||
|
print c; // expect: var
|
||||||
7
lox.t/assignment/to_this.lox
Normal file
7
lox.t/assignment/to_this.lox
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
class Foo {
|
||||||
|
Foo() {
|
||||||
|
this = "value"; // Error at '=': Invalid assignment target.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Foo();
|
||||||
1
lox.t/assignment/undefined.lox
Normal file
1
lox.t/assignment/undefined.lox
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
unknown = "what"; // expect runtime error: Undefined variable 'unknown'.
|
||||||
71
lox.t/benchmark/binary_trees.lox
Normal file
71
lox.t/benchmark/binary_trees.lox
Normal file
|
|
@ -0,0 +1,71 @@
|
||||||
|
class Tree {
|
||||||
|
init(item, depth) {
|
||||||
|
this.item = item;
|
||||||
|
this.depth = depth;
|
||||||
|
if (depth > 0) {
|
||||||
|
var item2 = item + item;
|
||||||
|
depth = depth - 1;
|
||||||
|
this.left = Tree(item2 - 1, depth);
|
||||||
|
this.right = Tree(item2, depth);
|
||||||
|
} else {
|
||||||
|
this.left = nil;
|
||||||
|
this.right = nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
check() {
|
||||||
|
if (this.left == nil) {
|
||||||
|
return this.item;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.item + this.left.check() - this.right.check();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var minDepth = 4;
|
||||||
|
var maxDepth = 14;
|
||||||
|
var stretchDepth = maxDepth + 1;
|
||||||
|
|
||||||
|
var start = clock();
|
||||||
|
|
||||||
|
print "stretch tree of depth:";
|
||||||
|
print stretchDepth;
|
||||||
|
print "check:";
|
||||||
|
print Tree(0, stretchDepth).check();
|
||||||
|
|
||||||
|
var longLivedTree = Tree(0, maxDepth);
|
||||||
|
|
||||||
|
// iterations = 2 ** maxDepth
|
||||||
|
var iterations = 1;
|
||||||
|
var d = 0;
|
||||||
|
while (d < maxDepth) {
|
||||||
|
iterations = iterations * 2;
|
||||||
|
d = d + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
var depth = minDepth;
|
||||||
|
while (depth < stretchDepth) {
|
||||||
|
var check = 0;
|
||||||
|
var i = 1;
|
||||||
|
while (i <= iterations) {
|
||||||
|
check = check + Tree(i, depth).check() + Tree(-i, depth).check();
|
||||||
|
i = i + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
print "num trees:";
|
||||||
|
print iterations * 2;
|
||||||
|
print "depth:";
|
||||||
|
print depth;
|
||||||
|
print "check:";
|
||||||
|
print check;
|
||||||
|
|
||||||
|
iterations = iterations / 4;
|
||||||
|
depth = depth + 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
print "long lived tree of depth:";
|
||||||
|
print maxDepth;
|
||||||
|
print "check:";
|
||||||
|
print longLivedTree.check();
|
||||||
|
print "elapsed:";
|
||||||
|
print clock() - start;
|
||||||
34
lox.t/benchmark/equality.lox
Normal file
34
lox.t/benchmark/equality.lox
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
var i = 0;
|
||||||
|
|
||||||
|
var loopStart = clock();
|
||||||
|
|
||||||
|
while (i < 10000000) {
|
||||||
|
i = i + 1;
|
||||||
|
|
||||||
|
1; 1; 1; 2; 1; nil; 1; "str"; 1; true;
|
||||||
|
nil; nil; nil; 1; nil; "str"; nil; true;
|
||||||
|
true; true; true; 1; true; false; true; "str"; true; nil;
|
||||||
|
"str"; "str"; "str"; "stru"; "str"; 1; "str"; nil; "str"; true;
|
||||||
|
}
|
||||||
|
|
||||||
|
var loopTime = clock() - loopStart;
|
||||||
|
|
||||||
|
var start = clock();
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (i < 10000000) {
|
||||||
|
i = i + 1;
|
||||||
|
|
||||||
|
1 == 1; 1 == 2; 1 == nil; 1 == "str"; 1 == true;
|
||||||
|
nil == nil; nil == 1; nil == "str"; nil == true;
|
||||||
|
true == true; true == 1; true == false; true == "str"; true == nil;
|
||||||
|
"str" == "str"; "str" == "stru"; "str" == 1; "str" == nil; "str" == true;
|
||||||
|
}
|
||||||
|
|
||||||
|
var elapsed = clock() - start;
|
||||||
|
print "loop";
|
||||||
|
print loopTime;
|
||||||
|
print "elapsed";
|
||||||
|
print elapsed;
|
||||||
|
print "equals";
|
||||||
|
print elapsed - loopTime;
|
||||||
8
lox.t/benchmark/fib.lox
Normal file
8
lox.t/benchmark/fib.lox
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
fun fib(n) {
|
||||||
|
if (n < 2) return n;
|
||||||
|
return fib(n - 2) + fib(n - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
var start = clock();
|
||||||
|
print fib(35) == 9227465;
|
||||||
|
print clock() - start;
|
||||||
43
lox.t/benchmark/instantiation.lox
Normal file
43
lox.t/benchmark/instantiation.lox
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
// This benchmark stresses instance creation and initializer calling.
|
||||||
|
|
||||||
|
class Foo {
|
||||||
|
init() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
var start = clock();
|
||||||
|
var i = 0;
|
||||||
|
while (i < 500000) {
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
Foo();
|
||||||
|
i = i + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
print clock() - start;
|
||||||
73
lox.t/benchmark/invocation.lox
Normal file
73
lox.t/benchmark/invocation.lox
Normal file
|
|
@ -0,0 +1,73 @@
|
||||||
|
// This benchmark stresses just method invocation.
|
||||||
|
|
||||||
|
class Foo {
|
||||||
|
method0() {}
|
||||||
|
method1() {}
|
||||||
|
method2() {}
|
||||||
|
method3() {}
|
||||||
|
method4() {}
|
||||||
|
method5() {}
|
||||||
|
method6() {}
|
||||||
|
method7() {}
|
||||||
|
method8() {}
|
||||||
|
method9() {}
|
||||||
|
method10() {}
|
||||||
|
method11() {}
|
||||||
|
method12() {}
|
||||||
|
method13() {}
|
||||||
|
method14() {}
|
||||||
|
method15() {}
|
||||||
|
method16() {}
|
||||||
|
method17() {}
|
||||||
|
method18() {}
|
||||||
|
method19() {}
|
||||||
|
method20() {}
|
||||||
|
method21() {}
|
||||||
|
method22() {}
|
||||||
|
method23() {}
|
||||||
|
method24() {}
|
||||||
|
method25() {}
|
||||||
|
method26() {}
|
||||||
|
method27() {}
|
||||||
|
method28() {}
|
||||||
|
method29() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
var foo = Foo();
|
||||||
|
var start = clock();
|
||||||
|
var i = 0;
|
||||||
|
while (i < 500000) {
|
||||||
|
foo.method0();
|
||||||
|
foo.method1();
|
||||||
|
foo.method2();
|
||||||
|
foo.method3();
|
||||||
|
foo.method4();
|
||||||
|
foo.method5();
|
||||||
|
foo.method6();
|
||||||
|
foo.method7();
|
||||||
|
foo.method8();
|
||||||
|
foo.method9();
|
||||||
|
foo.method10();
|
||||||
|
foo.method11();
|
||||||
|
foo.method12();
|
||||||
|
foo.method13();
|
||||||
|
foo.method14();
|
||||||
|
foo.method15();
|
||||||
|
foo.method16();
|
||||||
|
foo.method17();
|
||||||
|
foo.method18();
|
||||||
|
foo.method19();
|
||||||
|
foo.method20();
|
||||||
|
foo.method21();
|
||||||
|
foo.method22();
|
||||||
|
foo.method23();
|
||||||
|
foo.method24();
|
||||||
|
foo.method25();
|
||||||
|
foo.method26();
|
||||||
|
foo.method27();
|
||||||
|
foo.method28();
|
||||||
|
foo.method29();
|
||||||
|
i = i + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
print clock() - start;
|
||||||
69
lox.t/benchmark/method_call.lox
Normal file
69
lox.t/benchmark/method_call.lox
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
class Toggle {
|
||||||
|
init(startState) {
|
||||||
|
this.state = startState;
|
||||||
|
}
|
||||||
|
|
||||||
|
value() { return this.state; }
|
||||||
|
|
||||||
|
activate() {
|
||||||
|
this.state = !this.state;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class NthToggle < Toggle {
|
||||||
|
init(startState, maxCounter) {
|
||||||
|
super.init(startState);
|
||||||
|
this.countMax = maxCounter;
|
||||||
|
this.count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
activate() {
|
||||||
|
this.count = this.count + 1;
|
||||||
|
if (this.count >= this.countMax) {
|
||||||
|
super.activate();
|
||||||
|
this.count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var start = clock();
|
||||||
|
var n = 100000;
|
||||||
|
var val = true;
|
||||||
|
var toggle = Toggle(val);
|
||||||
|
|
||||||
|
for (var i = 0; i < n; i = i + 1) {
|
||||||
|
val = toggle.activate().value();
|
||||||
|
val = toggle.activate().value();
|
||||||
|
val = toggle.activate().value();
|
||||||
|
val = toggle.activate().value();
|
||||||
|
val = toggle.activate().value();
|
||||||
|
val = toggle.activate().value();
|
||||||
|
val = toggle.activate().value();
|
||||||
|
val = toggle.activate().value();
|
||||||
|
val = toggle.activate().value();
|
||||||
|
val = toggle.activate().value();
|
||||||
|
}
|
||||||
|
|
||||||
|
print toggle.value();
|
||||||
|
|
||||||
|
val = true;
|
||||||
|
var ntoggle = NthToggle(val, 3);
|
||||||
|
|
||||||
|
for (var i = 0; i < n; i = i + 1) {
|
||||||
|
val = ntoggle.activate().value();
|
||||||
|
val = ntoggle.activate().value();
|
||||||
|
val = ntoggle.activate().value();
|
||||||
|
val = ntoggle.activate().value();
|
||||||
|
val = ntoggle.activate().value();
|
||||||
|
val = ntoggle.activate().value();
|
||||||
|
val = ntoggle.activate().value();
|
||||||
|
val = ntoggle.activate().value();
|
||||||
|
val = ntoggle.activate().value();
|
||||||
|
val = ntoggle.activate().value();
|
||||||
|
}
|
||||||
|
|
||||||
|
print ntoggle.value();
|
||||||
|
print clock() - start;
|
||||||
106
lox.t/benchmark/properties.lox
Normal file
106
lox.t/benchmark/properties.lox
Normal file
|
|
@ -0,0 +1,106 @@
|
||||||
|
// This benchmark stresses both field and method lookup.
|
||||||
|
|
||||||
|
class Foo {
|
||||||
|
init() {
|
||||||
|
this.field0 = 1;
|
||||||
|
this.field1 = 1;
|
||||||
|
this.field2 = 1;
|
||||||
|
this.field3 = 1;
|
||||||
|
this.field4 = 1;
|
||||||
|
this.field5 = 1;
|
||||||
|
this.field6 = 1;
|
||||||
|
this.field7 = 1;
|
||||||
|
this.field8 = 1;
|
||||||
|
this.field9 = 1;
|
||||||
|
this.field10 = 1;
|
||||||
|
this.field11 = 1;
|
||||||
|
this.field12 = 1;
|
||||||
|
this.field13 = 1;
|
||||||
|
this.field14 = 1;
|
||||||
|
this.field15 = 1;
|
||||||
|
this.field16 = 1;
|
||||||
|
this.field17 = 1;
|
||||||
|
this.field18 = 1;
|
||||||
|
this.field19 = 1;
|
||||||
|
this.field20 = 1;
|
||||||
|
this.field21 = 1;
|
||||||
|
this.field22 = 1;
|
||||||
|
this.field23 = 1;
|
||||||
|
this.field24 = 1;
|
||||||
|
this.field25 = 1;
|
||||||
|
this.field26 = 1;
|
||||||
|
this.field27 = 1;
|
||||||
|
this.field28 = 1;
|
||||||
|
this.field29 = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
method0() { return this.field0; }
|
||||||
|
method1() { return this.field1; }
|
||||||
|
method2() { return this.field2; }
|
||||||
|
method3() { return this.field3; }
|
||||||
|
method4() { return this.field4; }
|
||||||
|
method5() { return this.field5; }
|
||||||
|
method6() { return this.field6; }
|
||||||
|
method7() { return this.field7; }
|
||||||
|
method8() { return this.field8; }
|
||||||
|
method9() { return this.field9; }
|
||||||
|
method10() { return this.field10; }
|
||||||
|
method11() { return this.field11; }
|
||||||
|
method12() { return this.field12; }
|
||||||
|
method13() { return this.field13; }
|
||||||
|
method14() { return this.field14; }
|
||||||
|
method15() { return this.field15; }
|
||||||
|
method16() { return this.field16; }
|
||||||
|
method17() { return this.field17; }
|
||||||
|
method18() { return this.field18; }
|
||||||
|
method19() { return this.field19; }
|
||||||
|
method20() { return this.field20; }
|
||||||
|
method21() { return this.field21; }
|
||||||
|
method22() { return this.field22; }
|
||||||
|
method23() { return this.field23; }
|
||||||
|
method24() { return this.field24; }
|
||||||
|
method25() { return this.field25; }
|
||||||
|
method26() { return this.field26; }
|
||||||
|
method27() { return this.field27; }
|
||||||
|
method28() { return this.field28; }
|
||||||
|
method29() { return this.field29; }
|
||||||
|
}
|
||||||
|
|
||||||
|
var foo = Foo();
|
||||||
|
var start = clock();
|
||||||
|
var i = 0;
|
||||||
|
while (i < 500000) {
|
||||||
|
foo.method0();
|
||||||
|
foo.method1();
|
||||||
|
foo.method2();
|
||||||
|
foo.method3();
|
||||||
|
foo.method4();
|
||||||
|
foo.method5();
|
||||||
|
foo.method6();
|
||||||
|
foo.method7();
|
||||||
|
foo.method8();
|
||||||
|
foo.method9();
|
||||||
|
foo.method10();
|
||||||
|
foo.method11();
|
||||||
|
foo.method12();
|
||||||
|
foo.method13();
|
||||||
|
foo.method14();
|
||||||
|
foo.method15();
|
||||||
|
foo.method16();
|
||||||
|
foo.method17();
|
||||||
|
foo.method18();
|
||||||
|
foo.method19();
|
||||||
|
foo.method20();
|
||||||
|
foo.method21();
|
||||||
|
foo.method22();
|
||||||
|
foo.method23();
|
||||||
|
foo.method24();
|
||||||
|
foo.method25();
|
||||||
|
foo.method26();
|
||||||
|
foo.method27();
|
||||||
|
foo.method28();
|
||||||
|
foo.method29();
|
||||||
|
i = i + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
print clock() - start;
|
||||||
219
lox.t/benchmark/string_equality.lox
Normal file
219
lox.t/benchmark/string_equality.lox
Normal file
|
|
@ -0,0 +1,219 @@
|
||||||
|
var a1 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1";
|
||||||
|
var a2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2";
|
||||||
|
var a3 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3";
|
||||||
|
var a4 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4";
|
||||||
|
var a5 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa5";
|
||||||
|
var a6 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa6";
|
||||||
|
var a7 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa7";
|
||||||
|
var a8 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8";
|
||||||
|
|
||||||
|
var i = 0;
|
||||||
|
|
||||||
|
var loopStart = clock();
|
||||||
|
|
||||||
|
while (i < 100000) {
|
||||||
|
i = i + 1;
|
||||||
|
|
||||||
|
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||||
|
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||||
|
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||||
|
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||||
|
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||||
|
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||||
|
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||||
|
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||||
|
|
||||||
|
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||||
|
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||||
|
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||||
|
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||||
|
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||||
|
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||||
|
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||||
|
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||||
|
|
||||||
|
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||||
|
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||||
|
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||||
|
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||||
|
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||||
|
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||||
|
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||||
|
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||||
|
|
||||||
|
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||||
|
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||||
|
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||||
|
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||||
|
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||||
|
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||||
|
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||||
|
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||||
|
|
||||||
|
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||||
|
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||||
|
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||||
|
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||||
|
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||||
|
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||||
|
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||||
|
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||||
|
|
||||||
|
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||||
|
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||||
|
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||||
|
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||||
|
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||||
|
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||||
|
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||||
|
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||||
|
|
||||||
|
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||||
|
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||||
|
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||||
|
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||||
|
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||||
|
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||||
|
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||||
|
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||||
|
|
||||||
|
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||||
|
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||||
|
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||||
|
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||||
|
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||||
|
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||||
|
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||||
|
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||||
|
|
||||||
|
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||||
|
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||||
|
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||||
|
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||||
|
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||||
|
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||||
|
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||||
|
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||||
|
|
||||||
|
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||||
|
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||||
|
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||||
|
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||||
|
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||||
|
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||||
|
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||||
|
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||||
|
}
|
||||||
|
|
||||||
|
var loopTime = clock() - loopStart;
|
||||||
|
|
||||||
|
var start = clock();
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (i < 100000) {
|
||||||
|
i = i + 1;
|
||||||
|
|
||||||
|
// 1 == 1; 1 == 2; 1 == nil; 1 == "str"; 1 == true;
|
||||||
|
// nil == nil; nil == 1; nil == "str"; nil == true;
|
||||||
|
// true == true; true == 1; true == false; true == "str"; true == nil;
|
||||||
|
// "str" == "str"; "str" == "stru"; "str" == 1; "str" == nil; "str" == true;
|
||||||
|
|
||||||
|
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||||
|
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||||
|
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||||
|
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||||
|
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||||
|
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||||
|
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||||
|
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||||
|
|
||||||
|
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||||
|
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||||
|
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||||
|
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||||
|
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||||
|
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||||
|
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||||
|
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||||
|
|
||||||
|
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||||
|
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||||
|
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||||
|
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||||
|
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||||
|
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||||
|
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||||
|
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||||
|
|
||||||
|
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||||
|
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||||
|
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||||
|
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||||
|
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||||
|
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||||
|
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||||
|
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||||
|
|
||||||
|
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||||
|
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||||
|
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||||
|
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||||
|
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||||
|
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||||
|
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||||
|
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||||
|
|
||||||
|
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||||
|
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||||
|
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||||
|
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||||
|
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||||
|
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||||
|
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||||
|
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||||
|
|
||||||
|
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||||
|
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||||
|
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||||
|
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||||
|
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||||
|
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||||
|
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||||
|
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||||
|
|
||||||
|
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||||
|
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||||
|
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||||
|
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||||
|
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||||
|
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||||
|
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||||
|
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||||
|
|
||||||
|
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||||
|
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||||
|
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||||
|
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||||
|
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||||
|
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||||
|
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||||
|
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||||
|
|
||||||
|
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||||
|
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||||
|
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||||
|
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||||
|
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||||
|
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||||
|
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||||
|
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
var elapsed = clock() - start;
|
||||||
|
print "loop";
|
||||||
|
print loopTime;
|
||||||
|
print "elapsed";
|
||||||
|
print elapsed;
|
||||||
|
print "equals";
|
||||||
|
print elapsed - loopTime;
|
||||||
29
lox.t/benchmark/trees.lox
Normal file
29
lox.t/benchmark/trees.lox
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
class Tree {
|
||||||
|
init(depth) {
|
||||||
|
this.depth = depth;
|
||||||
|
if (depth > 0) {
|
||||||
|
this.a = Tree(depth - 1);
|
||||||
|
this.b = Tree(depth - 1);
|
||||||
|
this.c = Tree(depth - 1);
|
||||||
|
this.d = Tree(depth - 1);
|
||||||
|
this.e = Tree(depth - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
walk() {
|
||||||
|
if (this.depth == 0) return 0;
|
||||||
|
return this.depth
|
||||||
|
+ this.a.walk()
|
||||||
|
+ this.b.walk()
|
||||||
|
+ this.c.walk()
|
||||||
|
+ this.d.walk()
|
||||||
|
+ this.e.walk();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var tree = Tree(8);
|
||||||
|
var start = clock();
|
||||||
|
for (var i = 0; i < 100; i = i + 1) {
|
||||||
|
if (tree.walk() != 122068) print "Error";
|
||||||
|
}
|
||||||
|
print clock() - start;
|
||||||
31
lox.t/benchmark/zoo.lox
Normal file
31
lox.t/benchmark/zoo.lox
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
class Zoo {
|
||||||
|
init() {
|
||||||
|
this.aarvark = 1;
|
||||||
|
this.baboon = 1;
|
||||||
|
this.cat = 1;
|
||||||
|
this.donkey = 1;
|
||||||
|
this.elephant = 1;
|
||||||
|
this.fox = 1;
|
||||||
|
}
|
||||||
|
ant() { return this.aarvark; }
|
||||||
|
banana() { return this.baboon; }
|
||||||
|
tuna() { return this.cat; }
|
||||||
|
hay() { return this.donkey; }
|
||||||
|
grass() { return this.elephant; }
|
||||||
|
mouse() { return this.fox; }
|
||||||
|
}
|
||||||
|
|
||||||
|
var zoo = Zoo();
|
||||||
|
var sum = 0;
|
||||||
|
var start = clock();
|
||||||
|
while (sum < 10000000) {
|
||||||
|
sum = sum + zoo.ant()
|
||||||
|
+ zoo.banana()
|
||||||
|
+ zoo.tuna()
|
||||||
|
+ zoo.hay()
|
||||||
|
+ zoo.grass()
|
||||||
|
+ zoo.mouse();
|
||||||
|
}
|
||||||
|
|
||||||
|
print sum;
|
||||||
|
print clock() - start;
|
||||||
36
lox.t/benchmark/zoo_batch.lox
Normal file
36
lox.t/benchmark/zoo_batch.lox
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
class Zoo {
|
||||||
|
init() {
|
||||||
|
this.aarvark = 1;
|
||||||
|
this.baboon = 1;
|
||||||
|
this.cat = 1;
|
||||||
|
this.donkey = 1;
|
||||||
|
this.elephant = 1;
|
||||||
|
this.fox = 1;
|
||||||
|
}
|
||||||
|
ant() { return this.aarvark; }
|
||||||
|
banana() { return this.baboon; }
|
||||||
|
tuna() { return this.cat; }
|
||||||
|
hay() { return this.donkey; }
|
||||||
|
grass() { return this.elephant; }
|
||||||
|
mouse() { return this.fox; }
|
||||||
|
}
|
||||||
|
|
||||||
|
var zoo = Zoo();
|
||||||
|
var sum = 0;
|
||||||
|
var start = clock();
|
||||||
|
var batch = 0;
|
||||||
|
while (clock() - start < 10) {
|
||||||
|
for (var i = 0; i < 10000; i = i + 1) {
|
||||||
|
sum = sum + zoo.ant()
|
||||||
|
+ zoo.banana()
|
||||||
|
+ zoo.tuna()
|
||||||
|
+ zoo.hay()
|
||||||
|
+ zoo.grass()
|
||||||
|
+ zoo.mouse();
|
||||||
|
}
|
||||||
|
batch = batch + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
print sum;
|
||||||
|
print batch;
|
||||||
|
print clock() - start;
|
||||||
7
lox.t/block/empty.lox
Normal file
7
lox.t/block/empty.lox
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
{} // By itself.
|
||||||
|
|
||||||
|
// In a statement.
|
||||||
|
if (true) {}
|
||||||
|
if (false) {} else {}
|
||||||
|
|
||||||
|
print "ok"; // expect: ok
|
||||||
8
lox.t/block/scope.lox
Normal file
8
lox.t/block/scope.lox
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
var a = "outer";
|
||||||
|
|
||||||
|
{
|
||||||
|
var a = "inner";
|
||||||
|
print a; // expect: inner
|
||||||
|
}
|
||||||
|
|
||||||
|
print a; // expect: outer
|
||||||
23
lox.t/bool/equality.lox
Normal file
23
lox.t/bool/equality.lox
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
print true == true; // expect: true
|
||||||
|
print true == false; // expect: false
|
||||||
|
print false == true; // expect: false
|
||||||
|
print false == false; // expect: true
|
||||||
|
|
||||||
|
// Not equal to other types.
|
||||||
|
print true == 1; // expect: false
|
||||||
|
print false == 0; // expect: false
|
||||||
|
print true == "true"; // expect: false
|
||||||
|
print false == "false"; // expect: false
|
||||||
|
print false == ""; // expect: false
|
||||||
|
|
||||||
|
print true != true; // expect: false
|
||||||
|
print true != false; // expect: true
|
||||||
|
print false != true; // expect: true
|
||||||
|
print false != false; // expect: false
|
||||||
|
|
||||||
|
// Not equal to other types.
|
||||||
|
print true != 1; // expect: true
|
||||||
|
print false != 0; // expect: true
|
||||||
|
print true != "true"; // expect: true
|
||||||
|
print false != "false"; // expect: true
|
||||||
|
print false != ""; // expect: true
|
||||||
3
lox.t/bool/not.lox
Normal file
3
lox.t/bool/not.lox
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
print !true; // expect: false
|
||||||
|
print !false; // expect: true
|
||||||
|
print !!true; // expect: true
|
||||||
1
lox.t/call/bool.lox
Normal file
1
lox.t/call/bool.lox
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
true(); // expect runtime error: Can only call functions and classes.
|
||||||
1
lox.t/call/nil.lox
Normal file
1
lox.t/call/nil.lox
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
nil(); // expect runtime error: Can only call functions and classes.
|
||||||
1
lox.t/call/num.lox
Normal file
1
lox.t/call/num.lox
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
123(); // expect runtime error: Can only call functions and classes.
|
||||||
4
lox.t/call/object.lox
Normal file
4
lox.t/call/object.lox
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
class Foo {}
|
||||||
|
|
||||||
|
var foo = Foo();
|
||||||
|
foo(); // expect runtime error: Can only call functions and classes.
|
||||||
1
lox.t/call/string.lox
Normal file
1
lox.t/call/string.lox
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
"str"(); // expect runtime error: Can only call functions and classes.
|
||||||
3
lox.t/class/empty.lox
Normal file
3
lox.t/class/empty.lox
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
class Foo {}
|
||||||
|
|
||||||
|
print Foo; // expect: Foo
|
||||||
1
lox.t/class/inherit_self.lox
Normal file
1
lox.t/class/inherit_self.lox
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
class Foo < Foo {} // Error at 'Foo': A class can't inherit from itself.
|
||||||
22
lox.t/class/inherited_method.lox
Normal file
22
lox.t/class/inherited_method.lox
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
class Foo {
|
||||||
|
inFoo() {
|
||||||
|
print "in foo";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Bar < Foo {
|
||||||
|
inBar() {
|
||||||
|
print "in bar";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Baz < Bar {
|
||||||
|
inBaz() {
|
||||||
|
print "in baz";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var baz = Baz();
|
||||||
|
baz.inFoo(); // expect: in foo
|
||||||
|
baz.inBar(); // expect: in bar
|
||||||
|
baz.inBaz(); // expect: in baz
|
||||||
8
lox.t/class/local_inherit_other.lox
Normal file
8
lox.t/class/local_inherit_other.lox
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
class A {}
|
||||||
|
|
||||||
|
fun f() {
|
||||||
|
class B < A {}
|
||||||
|
return B;
|
||||||
|
}
|
||||||
|
|
||||||
|
print f(); // expect: B
|
||||||
4
lox.t/class/local_inherit_self.lox
Normal file
4
lox.t/class/local_inherit_self.lox
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
class Foo < Foo {} // Error at 'Foo': A class can't inherit from itself.
|
||||||
|
}
|
||||||
|
// [c line 5] Error at end: Expect '}' after block.
|
||||||
9
lox.t/class/local_reference_self.lox
Normal file
9
lox.t/class/local_reference_self.lox
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
class Foo {
|
||||||
|
returnSelf() {
|
||||||
|
return Foo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print Foo().returnSelf(); // expect: Foo
|
||||||
|
}
|
||||||
7
lox.t/class/reference_self.lox
Normal file
7
lox.t/class/reference_self.lox
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
class Foo {
|
||||||
|
returnSelf() {
|
||||||
|
return Foo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print Foo().returnSelf(); // expect: Foo
|
||||||
27
lox.t/closure/assign_to_closure.lox
Normal file
27
lox.t/closure/assign_to_closure.lox
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
var f;
|
||||||
|
var g;
|
||||||
|
|
||||||
|
{
|
||||||
|
var local = "local";
|
||||||
|
fun f_() {
|
||||||
|
print local;
|
||||||
|
local = "after f";
|
||||||
|
print local;
|
||||||
|
}
|
||||||
|
f = f_;
|
||||||
|
|
||||||
|
fun g_() {
|
||||||
|
print local;
|
||||||
|
local = "after g";
|
||||||
|
print local;
|
||||||
|
}
|
||||||
|
g = g_;
|
||||||
|
}
|
||||||
|
|
||||||
|
f();
|
||||||
|
// expect: local
|
||||||
|
// expect: after f
|
||||||
|
|
||||||
|
g();
|
||||||
|
// expect: after f
|
||||||
|
// expect: after g
|
||||||
13
lox.t/closure/assign_to_shadowed_later.lox
Normal file
13
lox.t/closure/assign_to_shadowed_later.lox
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
var a = "global";
|
||||||
|
|
||||||
|
{
|
||||||
|
fun assign() {
|
||||||
|
a = "assigned";
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = "inner";
|
||||||
|
assign();
|
||||||
|
print a; // expect: inner
|
||||||
|
}
|
||||||
|
|
||||||
|
print a; // expect: assigned
|
||||||
11
lox.t/closure/close_over_function_parameter.lox
Normal file
11
lox.t/closure/close_over_function_parameter.lox
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
var f;
|
||||||
|
|
||||||
|
fun foo(param) {
|
||||||
|
fun f_() {
|
||||||
|
print param;
|
||||||
|
}
|
||||||
|
f = f_;
|
||||||
|
}
|
||||||
|
foo("param");
|
||||||
|
|
||||||
|
f(); // expect: param
|
||||||
15
lox.t/closure/close_over_later_variable.lox
Normal file
15
lox.t/closure/close_over_later_variable.lox
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
// This is a regression test. There was a bug where if an upvalue for an
|
||||||
|
// earlier local (here "a") was captured *after* a later one ("b"), then it
|
||||||
|
// would crash because it walked to the end of the upvalue list (correct), but
|
||||||
|
// then didn't handle not finding the variable.
|
||||||
|
|
||||||
|
fun f() {
|
||||||
|
var a = "a";
|
||||||
|
var b = "b";
|
||||||
|
fun g() {
|
||||||
|
print b; // expect: b
|
||||||
|
print a; // expect: a
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f();
|
||||||
13
lox.t/closure/close_over_method_parameter.lox
Normal file
13
lox.t/closure/close_over_method_parameter.lox
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
var f;
|
||||||
|
|
||||||
|
class Foo {
|
||||||
|
method(param) {
|
||||||
|
fun f_() {
|
||||||
|
print param;
|
||||||
|
}
|
||||||
|
f = f_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Foo().method("param");
|
||||||
|
f(); // expect: param
|
||||||
11
lox.t/closure/closed_closure_in_function.lox
Normal file
11
lox.t/closure/closed_closure_in_function.lox
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
var f;
|
||||||
|
|
||||||
|
{
|
||||||
|
var local = "local";
|
||||||
|
fun f_() {
|
||||||
|
print local;
|
||||||
|
}
|
||||||
|
f = f_;
|
||||||
|
}
|
||||||
|
|
||||||
|
f(); // expect: local
|
||||||
25
lox.t/closure/nested_closure.lox
Normal file
25
lox.t/closure/nested_closure.lox
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
var f;
|
||||||
|
|
||||||
|
fun f1() {
|
||||||
|
var a = "a";
|
||||||
|
fun f2() {
|
||||||
|
var b = "b";
|
||||||
|
fun f3() {
|
||||||
|
var c = "c";
|
||||||
|
fun f4() {
|
||||||
|
print a;
|
||||||
|
print b;
|
||||||
|
print c;
|
||||||
|
}
|
||||||
|
f = f4;
|
||||||
|
}
|
||||||
|
f3();
|
||||||
|
}
|
||||||
|
f2();
|
||||||
|
}
|
||||||
|
f1();
|
||||||
|
|
||||||
|
f();
|
||||||
|
// expect: a
|
||||||
|
// expect: b
|
||||||
|
// expect: c
|
||||||
7
lox.t/closure/open_closure_in_function.lox
Normal file
7
lox.t/closure/open_closure_in_function.lox
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
var local = "local";
|
||||||
|
fun f() {
|
||||||
|
print local; // expect: local
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
14
lox.t/closure/reference_closure_multiple_times.lox
Normal file
14
lox.t/closure/reference_closure_multiple_times.lox
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
var f;
|
||||||
|
|
||||||
|
{
|
||||||
|
var a = "a";
|
||||||
|
fun f_() {
|
||||||
|
print a;
|
||||||
|
print a;
|
||||||
|
}
|
||||||
|
f = f_;
|
||||||
|
}
|
||||||
|
|
||||||
|
f();
|
||||||
|
// expect: a
|
||||||
|
// expect: a
|
||||||
16
lox.t/closure/reuse_closure_slot.lox
Normal file
16
lox.t/closure/reuse_closure_slot.lox
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
var f;
|
||||||
|
|
||||||
|
{
|
||||||
|
var a = "a";
|
||||||
|
fun f_() { print a; }
|
||||||
|
f = f_;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// Since a is out of scope, the local slot will be reused by b. Make sure
|
||||||
|
// that f still closes over a.
|
||||||
|
var b = "b";
|
||||||
|
f(); // expect: a
|
||||||
|
}
|
||||||
|
}
|
||||||
12
lox.t/closure/shadow_closure_with_local.lox
Normal file
12
lox.t/closure/shadow_closure_with_local.lox
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
var foo = "closure";
|
||||||
|
fun f() {
|
||||||
|
{
|
||||||
|
print foo; // expect: closure
|
||||||
|
var foo = "shadow";
|
||||||
|
print foo; // expect: shadow
|
||||||
|
}
|
||||||
|
print foo; // expect: closure
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
13
lox.t/closure/unused_closure.lox
Normal file
13
lox.t/closure/unused_closure.lox
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
// This is a regression test. There was a bug where the VM would try to close
|
||||||
|
// an upvalue even if the upvalue was never created because the codepath for
|
||||||
|
// the closure was not executed.
|
||||||
|
|
||||||
|
{
|
||||||
|
var a = "a";
|
||||||
|
if (false) {
|
||||||
|
fun foo() { a; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we get here, we didn't segfault when a went out of scope.
|
||||||
|
print "ok"; // expect: ok
|
||||||
28
lox.t/closure/unused_later_closure.lox
Normal file
28
lox.t/closure/unused_later_closure.lox
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
// This is a regression test. When closing upvalues for discarded locals, it
|
||||||
|
// wouldn't make sure it discarded the upvalue for the correct stack slot.
|
||||||
|
//
|
||||||
|
// Here we create two locals that can be closed over, but only the first one
|
||||||
|
// actually is. When "b" goes out of scope, we need to make sure we don't
|
||||||
|
// prematurely close "a".
|
||||||
|
var closure;
|
||||||
|
|
||||||
|
{
|
||||||
|
var a = "a";
|
||||||
|
|
||||||
|
{
|
||||||
|
var b = "b";
|
||||||
|
fun returnA() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
closure = returnA;
|
||||||
|
|
||||||
|
if (false) {
|
||||||
|
fun returnB() {
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print closure(); // expect: a
|
||||||
|
}
|
||||||
2
lox.t/comments/line_at_eof.lox
Normal file
2
lox.t/comments/line_at_eof.lox
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
print "ok"; // expect: ok
|
||||||
|
// comment
|
||||||
1
lox.t/comments/only_line_comment.lox
Normal file
1
lox.t/comments/only_line_comment.lox
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
// comment
|
||||||
1
lox.t/comments/only_line_comment_and_line.lox
Normal file
1
lox.t/comments/only_line_comment_and_line.lox
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
// comment
|
||||||
9
lox.t/comments/unicode.lox
Normal file
9
lox.t/comments/unicode.lox
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
// Unicode characters are allowed in comments.
|
||||||
|
//
|
||||||
|
// Latin 1 Supplement: £§¶ÜÞ
|
||||||
|
// Latin Extended-A: ĐĦŋœ
|
||||||
|
// Latin Extended-B: ƂƢƩǁ
|
||||||
|
// Other stuff: ឃᢆ᯽₪ℜ↩⊗┺░
|
||||||
|
// Emoji: ☃☺♣
|
||||||
|
|
||||||
|
print "ok"; // expect: ok
|
||||||
11
lox.t/constructor/arguments.lox
Normal file
11
lox.t/constructor/arguments.lox
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
class Foo {
|
||||||
|
init(a, b) {
|
||||||
|
print "init"; // expect: init
|
||||||
|
this.a = a;
|
||||||
|
this.b = b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var foo = Foo(1, 2);
|
||||||
|
print foo.a; // expect: 1
|
||||||
|
print foo.b; // expect: 2
|
||||||
11
lox.t/constructor/call_init_early_return.lox
Normal file
11
lox.t/constructor/call_init_early_return.lox
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
class Foo {
|
||||||
|
init() {
|
||||||
|
print "init";
|
||||||
|
return;
|
||||||
|
print "nope";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var foo = Foo(); // expect: init
|
||||||
|
print foo.init(); // expect: init
|
||||||
|
// expect: Foo instance
|
||||||
15
lox.t/constructor/call_init_explicitly.lox
Normal file
15
lox.t/constructor/call_init_explicitly.lox
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
class Foo {
|
||||||
|
init(arg) {
|
||||||
|
print "Foo.init(" + arg + ")";
|
||||||
|
this.field = "init";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var foo = Foo("one"); // expect: Foo.init(one)
|
||||||
|
foo.field = "field";
|
||||||
|
|
||||||
|
var foo2 = foo.init("two"); // expect: Foo.init(two)
|
||||||
|
print foo2; // expect: Foo instance
|
||||||
|
|
||||||
|
// Make sure init() doesn't create a fresh instance.
|
||||||
|
print foo.field; // expect: init
|
||||||
4
lox.t/constructor/default.lox
Normal file
4
lox.t/constructor/default.lox
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
class Foo {}
|
||||||
|
|
||||||
|
var foo = Foo();
|
||||||
|
print foo; // expect: Foo instance
|
||||||
3
lox.t/constructor/default_arguments.lox
Normal file
3
lox.t/constructor/default_arguments.lox
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
class Foo {}
|
||||||
|
|
||||||
|
var foo = Foo(1, 2, 3); // expect runtime error: Expected 0 arguments but got 3.
|
||||||
10
lox.t/constructor/early_return.lox
Normal file
10
lox.t/constructor/early_return.lox
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
class Foo {
|
||||||
|
init() {
|
||||||
|
print "init";
|
||||||
|
return;
|
||||||
|
print "nope";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var foo = Foo(); // expect: init
|
||||||
|
print foo; // expect: Foo instance
|
||||||
8
lox.t/constructor/extra_arguments.lox
Normal file
8
lox.t/constructor/extra_arguments.lox
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
class Foo {
|
||||||
|
init(a, b) {
|
||||||
|
this.a = a;
|
||||||
|
this.b = b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var foo = Foo(1, 2, 3, 4); // expect runtime error: Expected 2 arguments but got 4.
|
||||||
12
lox.t/constructor/init_not_method.lox
Normal file
12
lox.t/constructor/init_not_method.lox
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
class Foo {
|
||||||
|
init(arg) {
|
||||||
|
print "Foo.init(" + arg + ")";
|
||||||
|
this.field = "init";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun init() {
|
||||||
|
print "not initializer";
|
||||||
|
}
|
||||||
|
|
||||||
|
init(); // expect: not initializer
|
||||||
5
lox.t/constructor/missing_arguments.lox
Normal file
5
lox.t/constructor/missing_arguments.lox
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
class Foo {
|
||||||
|
init(a, b) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
var foo = Foo(1); // expect runtime error: Expected 2 arguments but got 1.
|
||||||
10
lox.t/constructor/return_in_nested_function.lox
Normal file
10
lox.t/constructor/return_in_nested_function.lox
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
class Foo {
|
||||||
|
init() {
|
||||||
|
fun init() {
|
||||||
|
return "bar";
|
||||||
|
}
|
||||||
|
print init(); // expect: bar
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print Foo(); // expect: Foo instance
|
||||||
5
lox.t/constructor/return_value.lox
Normal file
5
lox.t/constructor/return_value.lox
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
class Foo {
|
||||||
|
init() {
|
||||||
|
return "result"; // Error at 'return': Can't return a value from an initializer.
|
||||||
|
}
|
||||||
|
}
|
||||||
2
lox.t/dune
Normal file
2
lox.t/dune
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
(cram
|
||||||
|
(deps %{bin:mlox}))
|
||||||
0
lox.t/empty_file.lox
Normal file
0
lox.t/empty_file.lox
Normal file
4
lox.t/expressions/evaluate.lox
Normal file
4
lox.t/expressions/evaluate.lox
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
// Note: This is just for the expression evaluating chapter which evaluates an
|
||||||
|
// expression directly.
|
||||||
|
(5 - (3 - 1)) + -1
|
||||||
|
// expect: 2
|
||||||
3
lox.t/expressions/parse.lox
Normal file
3
lox.t/expressions/parse.lox
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
// Note: This is just for the expression parsing chapter which prints the AST.
|
||||||
|
(5 - (3 - 1)) + -1
|
||||||
|
// expect: (+ (group (- 5.0 (group (- 3.0 1.0)))) (- 1.0))
|
||||||
15
lox.t/field/call_function_field.lox
Normal file
15
lox.t/field/call_function_field.lox
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
class Foo {}
|
||||||
|
|
||||||
|
fun bar(a, b) {
|
||||||
|
print "bar";
|
||||||
|
print a;
|
||||||
|
print b;
|
||||||
|
}
|
||||||
|
|
||||||
|
var foo = Foo();
|
||||||
|
foo.bar = bar;
|
||||||
|
|
||||||
|
foo.bar(1, 2);
|
||||||
|
// expect: bar
|
||||||
|
// expect: 1
|
||||||
|
// expect: 2
|
||||||
6
lox.t/field/call_nonfunction_field.lox
Normal file
6
lox.t/field/call_nonfunction_field.lox
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
class Foo {}
|
||||||
|
|
||||||
|
var foo = Foo();
|
||||||
|
foo.bar = "not fn";
|
||||||
|
|
||||||
|
foo.bar(); // expect runtime error: Can only call functions and classes.
|
||||||
25
lox.t/field/get_and_set_method.lox
Normal file
25
lox.t/field/get_and_set_method.lox
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
// Bound methods have identity equality.
|
||||||
|
class Foo {
|
||||||
|
method(a) {
|
||||||
|
print "method";
|
||||||
|
print a;
|
||||||
|
}
|
||||||
|
other(a) {
|
||||||
|
print "other";
|
||||||
|
print a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var foo = Foo();
|
||||||
|
var method = foo.method;
|
||||||
|
|
||||||
|
// Setting a property shadows the instance method.
|
||||||
|
foo.method = foo.other;
|
||||||
|
foo.method(1);
|
||||||
|
// expect: other
|
||||||
|
// expect: 1
|
||||||
|
|
||||||
|
// The old method handle still points to the original method.
|
||||||
|
method(2);
|
||||||
|
// expect: method
|
||||||
|
// expect: 2
|
||||||
1
lox.t/field/get_on_bool.lox
Normal file
1
lox.t/field/get_on_bool.lox
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
true.foo; // expect runtime error: Only instances have properties.
|
||||||
2
lox.t/field/get_on_class.lox
Normal file
2
lox.t/field/get_on_class.lox
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
class Foo {}
|
||||||
|
Foo.bar; // expect runtime error: Only instances have properties.
|
||||||
3
lox.t/field/get_on_function.lox
Normal file
3
lox.t/field/get_on_function.lox
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
fun foo() {}
|
||||||
|
|
||||||
|
foo.bar; // expect runtime error: Only instances have properties.
|
||||||
1
lox.t/field/get_on_nil.lox
Normal file
1
lox.t/field/get_on_nil.lox
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
nil.foo; // expect runtime error: Only instances have properties.
|
||||||
1
lox.t/field/get_on_num.lox
Normal file
1
lox.t/field/get_on_num.lox
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
123.foo; // expect runtime error: Only instances have properties.
|
||||||
1
lox.t/field/get_on_string.lox
Normal file
1
lox.t/field/get_on_string.lox
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
"str".foo; // expect runtime error: Only instances have properties.
|
||||||
170
lox.t/field/many.lox
Normal file
170
lox.t/field/many.lox
Normal file
|
|
@ -0,0 +1,170 @@
|
||||||
|
class Foo {}
|
||||||
|
|
||||||
|
var foo = Foo();
|
||||||
|
fun setFields() {
|
||||||
|
foo.bilberry = "bilberry";
|
||||||
|
foo.lime = "lime";
|
||||||
|
foo.elderberry = "elderberry";
|
||||||
|
foo.raspberry = "raspberry";
|
||||||
|
foo.gooseberry = "gooseberry";
|
||||||
|
foo.longan = "longan";
|
||||||
|
foo.mandarine = "mandarine";
|
||||||
|
foo.kiwifruit = "kiwifruit";
|
||||||
|
foo.orange = "orange";
|
||||||
|
foo.pomegranate = "pomegranate";
|
||||||
|
foo.tomato = "tomato";
|
||||||
|
foo.banana = "banana";
|
||||||
|
foo.juniper = "juniper";
|
||||||
|
foo.damson = "damson";
|
||||||
|
foo.blackcurrant = "blackcurrant";
|
||||||
|
foo.peach = "peach";
|
||||||
|
foo.grape = "grape";
|
||||||
|
foo.mango = "mango";
|
||||||
|
foo.redcurrant = "redcurrant";
|
||||||
|
foo.watermelon = "watermelon";
|
||||||
|
foo.plumcot = "plumcot";
|
||||||
|
foo.papaya = "papaya";
|
||||||
|
foo.cloudberry = "cloudberry";
|
||||||
|
foo.rambutan = "rambutan";
|
||||||
|
foo.salak = "salak";
|
||||||
|
foo.physalis = "physalis";
|
||||||
|
foo.huckleberry = "huckleberry";
|
||||||
|
foo.coconut = "coconut";
|
||||||
|
foo.date = "date";
|
||||||
|
foo.tamarind = "tamarind";
|
||||||
|
foo.lychee = "lychee";
|
||||||
|
foo.raisin = "raisin";
|
||||||
|
foo.apple = "apple";
|
||||||
|
foo.avocado = "avocado";
|
||||||
|
foo.nectarine = "nectarine";
|
||||||
|
foo.pomelo = "pomelo";
|
||||||
|
foo.melon = "melon";
|
||||||
|
foo.currant = "currant";
|
||||||
|
foo.plum = "plum";
|
||||||
|
foo.persimmon = "persimmon";
|
||||||
|
foo.olive = "olive";
|
||||||
|
foo.cranberry = "cranberry";
|
||||||
|
foo.boysenberry = "boysenberry";
|
||||||
|
foo.blackberry = "blackberry";
|
||||||
|
foo.passionfruit = "passionfruit";
|
||||||
|
foo.mulberry = "mulberry";
|
||||||
|
foo.marionberry = "marionberry";
|
||||||
|
foo.plantain = "plantain";
|
||||||
|
foo.lemon = "lemon";
|
||||||
|
foo.yuzu = "yuzu";
|
||||||
|
foo.loquat = "loquat";
|
||||||
|
foo.kumquat = "kumquat";
|
||||||
|
foo.salmonberry = "salmonberry";
|
||||||
|
foo.tangerine = "tangerine";
|
||||||
|
foo.durian = "durian";
|
||||||
|
foo.pear = "pear";
|
||||||
|
foo.cantaloupe = "cantaloupe";
|
||||||
|
foo.quince = "quince";
|
||||||
|
foo.guava = "guava";
|
||||||
|
foo.strawberry = "strawberry";
|
||||||
|
foo.nance = "nance";
|
||||||
|
foo.apricot = "apricot";
|
||||||
|
foo.jambul = "jambul";
|
||||||
|
foo.grapefruit = "grapefruit";
|
||||||
|
foo.clementine = "clementine";
|
||||||
|
foo.jujube = "jujube";
|
||||||
|
foo.cherry = "cherry";
|
||||||
|
foo.feijoa = "feijoa";
|
||||||
|
foo.jackfruit = "jackfruit";
|
||||||
|
foo.fig = "fig";
|
||||||
|
foo.cherimoya = "cherimoya";
|
||||||
|
foo.pineapple = "pineapple";
|
||||||
|
foo.blueberry = "blueberry";
|
||||||
|
foo.jabuticaba = "jabuticaba";
|
||||||
|
foo.miracle = "miracle";
|
||||||
|
foo.dragonfruit = "dragonfruit";
|
||||||
|
foo.satsuma = "satsuma";
|
||||||
|
foo.tamarillo = "tamarillo";
|
||||||
|
foo.honeydew = "honeydew";
|
||||||
|
}
|
||||||
|
|
||||||
|
setFields();
|
||||||
|
|
||||||
|
fun printFields() {
|
||||||
|
print foo.apple; // expect: apple
|
||||||
|
print foo.apricot; // expect: apricot
|
||||||
|
print foo.avocado; // expect: avocado
|
||||||
|
print foo.banana; // expect: banana
|
||||||
|
print foo.bilberry; // expect: bilberry
|
||||||
|
print foo.blackberry; // expect: blackberry
|
||||||
|
print foo.blackcurrant; // expect: blackcurrant
|
||||||
|
print foo.blueberry; // expect: blueberry
|
||||||
|
print foo.boysenberry; // expect: boysenberry
|
||||||
|
print foo.cantaloupe; // expect: cantaloupe
|
||||||
|
print foo.cherimoya; // expect: cherimoya
|
||||||
|
print foo.cherry; // expect: cherry
|
||||||
|
print foo.clementine; // expect: clementine
|
||||||
|
print foo.cloudberry; // expect: cloudberry
|
||||||
|
print foo.coconut; // expect: coconut
|
||||||
|
print foo.cranberry; // expect: cranberry
|
||||||
|
print foo.currant; // expect: currant
|
||||||
|
print foo.damson; // expect: damson
|
||||||
|
print foo.date; // expect: date
|
||||||
|
print foo.dragonfruit; // expect: dragonfruit
|
||||||
|
print foo.durian; // expect: durian
|
||||||
|
print foo.elderberry; // expect: elderberry
|
||||||
|
print foo.feijoa; // expect: feijoa
|
||||||
|
print foo.fig; // expect: fig
|
||||||
|
print foo.gooseberry; // expect: gooseberry
|
||||||
|
print foo.grape; // expect: grape
|
||||||
|
print foo.grapefruit; // expect: grapefruit
|
||||||
|
print foo.guava; // expect: guava
|
||||||
|
print foo.honeydew; // expect: honeydew
|
||||||
|
print foo.huckleberry; // expect: huckleberry
|
||||||
|
print foo.jabuticaba; // expect: jabuticaba
|
||||||
|
print foo.jackfruit; // expect: jackfruit
|
||||||
|
print foo.jambul; // expect: jambul
|
||||||
|
print foo.jujube; // expect: jujube
|
||||||
|
print foo.juniper; // expect: juniper
|
||||||
|
print foo.kiwifruit; // expect: kiwifruit
|
||||||
|
print foo.kumquat; // expect: kumquat
|
||||||
|
print foo.lemon; // expect: lemon
|
||||||
|
print foo.lime; // expect: lime
|
||||||
|
print foo.longan; // expect: longan
|
||||||
|
print foo.loquat; // expect: loquat
|
||||||
|
print foo.lychee; // expect: lychee
|
||||||
|
print foo.mandarine; // expect: mandarine
|
||||||
|
print foo.mango; // expect: mango
|
||||||
|
print foo.marionberry; // expect: marionberry
|
||||||
|
print foo.melon; // expect: melon
|
||||||
|
print foo.miracle; // expect: miracle
|
||||||
|
print foo.mulberry; // expect: mulberry
|
||||||
|
print foo.nance; // expect: nance
|
||||||
|
print foo.nectarine; // expect: nectarine
|
||||||
|
print foo.olive; // expect: olive
|
||||||
|
print foo.orange; // expect: orange
|
||||||
|
print foo.papaya; // expect: papaya
|
||||||
|
print foo.passionfruit; // expect: passionfruit
|
||||||
|
print foo.peach; // expect: peach
|
||||||
|
print foo.pear; // expect: pear
|
||||||
|
print foo.persimmon; // expect: persimmon
|
||||||
|
print foo.physalis; // expect: physalis
|
||||||
|
print foo.pineapple; // expect: pineapple
|
||||||
|
print foo.plantain; // expect: plantain
|
||||||
|
print foo.plum; // expect: plum
|
||||||
|
print foo.plumcot; // expect: plumcot
|
||||||
|
print foo.pomegranate; // expect: pomegranate
|
||||||
|
print foo.pomelo; // expect: pomelo
|
||||||
|
print foo.quince; // expect: quince
|
||||||
|
print foo.raisin; // expect: raisin
|
||||||
|
print foo.rambutan; // expect: rambutan
|
||||||
|
print foo.raspberry; // expect: raspberry
|
||||||
|
print foo.redcurrant; // expect: redcurrant
|
||||||
|
print foo.salak; // expect: salak
|
||||||
|
print foo.salmonberry; // expect: salmonberry
|
||||||
|
print foo.satsuma; // expect: satsuma
|
||||||
|
print foo.strawberry; // expect: strawberry
|
||||||
|
print foo.tamarillo; // expect: tamarillo
|
||||||
|
print foo.tamarind; // expect: tamarind
|
||||||
|
print foo.tangerine; // expect: tangerine
|
||||||
|
print foo.tomato; // expect: tomato
|
||||||
|
print foo.watermelon; // expect: watermelon
|
||||||
|
print foo.yuzu; // expect: yuzu
|
||||||
|
}
|
||||||
|
|
||||||
|
printFields();
|
||||||
9
lox.t/field/method.lox
Normal file
9
lox.t/field/method.lox
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
class Foo {
|
||||||
|
bar(arg) {
|
||||||
|
print arg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var bar = Foo().bar;
|
||||||
|
print "got method"; // expect: got method
|
||||||
|
bar("arg"); // expect: arg
|
||||||
19
lox.t/field/method_binds_this.lox
Normal file
19
lox.t/field/method_binds_this.lox
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
class Foo {
|
||||||
|
sayName(a) {
|
||||||
|
print this.name;
|
||||||
|
print a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var foo1 = Foo();
|
||||||
|
foo1.name = "foo1";
|
||||||
|
|
||||||
|
var foo2 = Foo();
|
||||||
|
foo2.name = "foo2";
|
||||||
|
|
||||||
|
// Store the method reference on another object.
|
||||||
|
foo2.fn = foo1.sayName;
|
||||||
|
// Still retains original receiver.
|
||||||
|
foo2.fn(1);
|
||||||
|
// expect: foo1
|
||||||
|
// expect: 1
|
||||||
9
lox.t/field/on_instance.lox
Normal file
9
lox.t/field/on_instance.lox
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
class Foo {}
|
||||||
|
|
||||||
|
var foo = Foo();
|
||||||
|
|
||||||
|
print foo.bar = "bar value"; // expect: bar value
|
||||||
|
print foo.baz = "baz value"; // expect: baz value
|
||||||
|
|
||||||
|
print foo.bar; // expect: bar value
|
||||||
|
print foo.baz; // expect: baz value
|
||||||
2
lox.t/field/set_evaluation_order.lox
Normal file
2
lox.t/field/set_evaluation_order.lox
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
undefined1.bar // expect runtime error: Undefined variable 'undefined1'.
|
||||||
|
= undefined2;
|
||||||
1
lox.t/field/set_on_bool.lox
Normal file
1
lox.t/field/set_on_bool.lox
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
true.foo = "value"; // expect runtime error: Only instances have fields.
|
||||||
2
lox.t/field/set_on_class.lox
Normal file
2
lox.t/field/set_on_class.lox
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
class Foo {}
|
||||||
|
Foo.bar = "value"; // expect runtime error: Only instances have fields.
|
||||||
3
lox.t/field/set_on_function.lox
Normal file
3
lox.t/field/set_on_function.lox
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
fun foo() {}
|
||||||
|
|
||||||
|
foo.bar = "value"; // expect runtime error: Only instances have fields.
|
||||||
1
lox.t/field/set_on_nil.lox
Normal file
1
lox.t/field/set_on_nil.lox
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
nil.foo = "value"; // expect runtime error: Only instances have fields.
|
||||||
1
lox.t/field/set_on_num.lox
Normal file
1
lox.t/field/set_on_num.lox
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
123.foo = "value"; // expect runtime error: Only instances have fields.
|
||||||
1
lox.t/field/set_on_string.lox
Normal file
1
lox.t/field/set_on_string.lox
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
"str".foo = "value"; // expect runtime error: Only instances have fields.
|
||||||
4
lox.t/field/undefined.lox
Normal file
4
lox.t/field/undefined.lox
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
class Foo {}
|
||||||
|
var foo = Foo();
|
||||||
|
|
||||||
|
foo.bar; // expect runtime error: Undefined property 'bar'.
|
||||||
2
lox.t/for/class_in_body.lox
Normal file
2
lox.t/for/class_in_body.lox
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
// [line 2] Error at 'class': Expect expression.
|
||||||
|
for (;;) class Foo {}
|
||||||
22
lox.t/for/closure_in_body.lox
Normal file
22
lox.t/for/closure_in_body.lox
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
var f1;
|
||||||
|
var f2;
|
||||||
|
var f3;
|
||||||
|
|
||||||
|
for (var i = 1; i < 4; i = i + 1) {
|
||||||
|
var j = i;
|
||||||
|
fun f() {
|
||||||
|
print i;
|
||||||
|
print j;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j == 1) f1 = f;
|
||||||
|
else if (j == 2) f2 = f;
|
||||||
|
else f3 = f;
|
||||||
|
}
|
||||||
|
|
||||||
|
f1(); // expect: 4
|
||||||
|
// expect: 1
|
||||||
|
f2(); // expect: 4
|
||||||
|
// expect: 2
|
||||||
|
f3(); // expect: 4
|
||||||
|
// expect: 3
|
||||||
2
lox.t/for/fun_in_body.lox
Normal file
2
lox.t/for/fun_in_body.lox
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
// [line 2] Error at 'fun': Expect expression.
|
||||||
|
for (;;) fun foo() {}
|
||||||
10
lox.t/for/return_closure.lox
Normal file
10
lox.t/for/return_closure.lox
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
fun f() {
|
||||||
|
for (;;) {
|
||||||
|
var i = "i";
|
||||||
|
fun g() { print i; }
|
||||||
|
return g;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var h = f();
|
||||||
|
h(); // expect: i
|
||||||
9
lox.t/for/return_inside.lox
Normal file
9
lox.t/for/return_inside.lox
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
fun f() {
|
||||||
|
for (;;) {
|
||||||
|
var i = "i";
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print f();
|
||||||
|
// expect: i
|
||||||
26
lox.t/for/scope.lox
Normal file
26
lox.t/for/scope.lox
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
var i = "before";
|
||||||
|
|
||||||
|
// New variable is in inner scope.
|
||||||
|
for (var i = 0; i < 1; i = i + 1) {
|
||||||
|
print i; // expect: 0
|
||||||
|
|
||||||
|
// Loop body is in second inner scope.
|
||||||
|
var i = -1;
|
||||||
|
print i; // expect: -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// New variable shadows outer variable.
|
||||||
|
for (var i = 0; i > 0; i = i + 1) {}
|
||||||
|
|
||||||
|
// Goes out of scope after loop.
|
||||||
|
var i = "after";
|
||||||
|
print i; // expect: after
|
||||||
|
|
||||||
|
// Can reuse an existing variable.
|
||||||
|
for (i = 0; i < 1; i = i + 1) {
|
||||||
|
print i; // expect: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
3
lox.t/for/statement_condition.lox
Normal file
3
lox.t/for/statement_condition.lox
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
// [line 3] Error at '{': Expect expression.
|
||||||
|
// [line 3] Error at ')': Expect ';' after expression.
|
||||||
|
for (var a = 1; {}; a = a + 1) {}
|
||||||
2
lox.t/for/statement_increment.lox
Normal file
2
lox.t/for/statement_increment.lox
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
// [line 2] Error at '{': Expect expression.
|
||||||
|
for (var a = 1; a < 2; {}) {}
|
||||||
3
lox.t/for/statement_initializer.lox
Normal file
3
lox.t/for/statement_initializer.lox
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
// [line 3] Error at '{': Expect expression.
|
||||||
|
// [line 3] Error at ')': Expect ';' after expression.
|
||||||
|
for ({}; a < 2; a = a + 1) {}
|
||||||
50
lox.t/for/syntax.lox
Normal file
50
lox.t/for/syntax.lox
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
// Single-expression body.
|
||||||
|
for (var c = 0; c < 3;) print c = c + 1;
|
||||||
|
// expect: 1
|
||||||
|
// expect: 2
|
||||||
|
// expect: 3
|
||||||
|
|
||||||
|
// Block body.
|
||||||
|
for (var a = 0; a < 3; a = a + 1) {
|
||||||
|
print a;
|
||||||
|
}
|
||||||
|
// expect: 0
|
||||||
|
// expect: 1
|
||||||
|
// expect: 2
|
||||||
|
|
||||||
|
// No clauses.
|
||||||
|
fun foo() {
|
||||||
|
for (;;) return "done";
|
||||||
|
}
|
||||||
|
print foo(); // expect: done
|
||||||
|
|
||||||
|
// No variable.
|
||||||
|
var i = 0;
|
||||||
|
for (; i < 2; i = i + 1) print i;
|
||||||
|
// expect: 0
|
||||||
|
// expect: 1
|
||||||
|
|
||||||
|
// No condition.
|
||||||
|
fun bar() {
|
||||||
|
for (var i = 0;; i = i + 1) {
|
||||||
|
print i;
|
||||||
|
if (i >= 2) return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bar();
|
||||||
|
// expect: 0
|
||||||
|
// expect: 1
|
||||||
|
// expect: 2
|
||||||
|
|
||||||
|
// No increment.
|
||||||
|
for (var i = 0; i < 2;) {
|
||||||
|
print i;
|
||||||
|
i = i + 1;
|
||||||
|
}
|
||||||
|
// expect: 0
|
||||||
|
// expect: 1
|
||||||
|
|
||||||
|
// Statement bodies.
|
||||||
|
for (; false;) if (true) 1; else 2;
|
||||||
|
for (; false;) while (true) 1;
|
||||||
|
for (; false;) for (;;) 1;
|
||||||
2
lox.t/for/var_in_body.lox
Normal file
2
lox.t/for/var_in_body.lox
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
// [line 2] Error at 'var': Expect expression.
|
||||||
|
for (;;) var foo;
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue