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