Make IO a static class instead of a singleton.

This commit is contained in:
Bob Nystrom
2013-12-21 19:25:09 -08:00
parent 24a6f4cd8c
commit 6c3aa85228
119 changed files with 532 additions and 536 deletions

View File

@ -26,7 +26,7 @@ var stretchDepth = maxDepth + 1
var start = OS.clock
io.write("stretch tree of depth " + stretchDepth.toString + " check: " +
IO.write("stretch tree of depth " + stretchDepth.toString + " check: " +
new Tree(0, stretchDepth).check.toString)
var longLivedTree = new Tree(0, maxDepth)
@ -48,13 +48,13 @@ while (depth < stretchDepth) {
i = i + 1
}
io.write((iterations * 2).toString + " trees of depth " + depth.toString +
IO.write((iterations * 2).toString + " trees of depth " + depth.toString +
" check: " + check.toString)
iterations = iterations / 4
depth = depth + 2
}
io.write("long lived tree of depth " + maxDepth.toString + " check: " +
IO.write("long lived tree of depth " + maxDepth.toString + " check: " +
longLivedTree.check.toString)
io.write("elapsed: " + (OS.clock - start).toString)
IO.write("elapsed: " + (OS.clock - start).toString)

View File

@ -9,7 +9,7 @@ var fib = fn(n) {
var start = OS.clock
var i = 0
while (i < 5) {
io.write(fib.call(28))
IO.write(fib.call(28))
i = i + 1
}
io.write("elapsed: " + (OS.clock - start).toString)
IO.write("elapsed: " + (OS.clock - start).toString)

View File

@ -39,7 +39,7 @@ while (i < n) {
i = i + 1
}
io.write(toggle.value)
IO.write(toggle.value)
val = true
var ntoggle = new NthToggle(val, 3)
@ -50,6 +50,6 @@ while (i < n) {
i = i + 1
}
io.write(ntoggle.value)
IO.write(ntoggle.value)
io.write("elapsed: " + (OS.clock - start).toString)
IO.write("elapsed: " + (OS.clock - start).toString)

View File

@ -1 +1 @@
io.write("Hello, world!")
IO.write("Hello, world!")

View File

@ -436,6 +436,7 @@ DEF_NATIVE(string_subscript)
DEF_NATIVE(io_write)
{
// TODO: Should call toString on its argument.
wrenPrintValue(args[1]);
printf("\n");
return args[1];
@ -531,12 +532,7 @@ void wrenInitializeCore(WrenVM* vm)
NATIVE(vm->stringClass, "[ ]", string_subscript);
ObjClass* ioClass = defineClass(vm, "IO", vm->objectClass);
NATIVE(ioClass, "write ", io_write);
// TODO: Making this an instance is lame. The only reason we're doing it is
// because "IO.write()" looks ugly. Maybe just get used to that?
Value ioObject = wrenNewInstance(vm, ioClass);
vm->globals[addSymbol(&vm->globalSymbols, "io", 2)] = ioObject;
NATIVE(ioClass->metaclass, "write ", io_write);
ObjClass* osClass = defineClass(vm, "OS", vm->objectClass);
NATIVE(osClass->metaclass, "clock", os_clock);

View File

@ -1,26 +1,26 @@
// Note: These tests implicitly depend on ints being truthy.
// Also rely on io.write() returning its argument.
// Also rely on IO.write() returning its argument.
// Return the first non-true argument.
io.write(false && 1) // expect: false
io.write(true && 1) // expect: 1
io.write(1 && 2 && false) // expect: false
IO.write(false && 1) // expect: false
IO.write(true && 1) // expect: 1
IO.write(1 && 2 && false) // expect: false
// Return the last argument if all are true.
io.write(1 && true) // expect: true
io.write(1 && 2 && 3) // expect: 3
IO.write(1 && true) // expect: true
IO.write(1 && 2 && 3) // expect: 3
// Short-circuit at the first false argument.
io.write(true) && // expect: true
io.write(false) && // expect: false
io.write(false) // should not print
IO.write(true) && // expect: true
IO.write(false) && // expect: false
IO.write(false) // should not print
// Swallow a trailing newline.
io.write(true &&
IO.write(true &&
true) // expect: true
// Only false is falsy.
io.write(0 && true) // expect: true
io.write(null && true) // expect: true
io.write("" && true) // expect: true
io.write(false && true) // expect: false
IO.write(0 && true) // expect: true
IO.write(null && true) // expect: true
IO.write("" && true) // expect: true
IO.write(false && true) // expect: false

View File

@ -4,6 +4,6 @@ var c = "c"
// Assignment is right-associative.
a = b = c
io.write(a) // expect: c
io.write(b) // expect: c
io.write(c) // expect: c
IO.write(a) // expect: c
IO.write(b) // expect: c
IO.write(c) // expect: c

View File

@ -1,8 +1,8 @@
var a = "before"
io.write(a) // expect: before
IO.write(a) // expect: before
a = "after"
io.write(a) // expect: after
IO.write(a) // expect: after
io.write(a = "arg") // expect: arg
io.write(a) // expect: arg
IO.write(a = "arg") // expect: arg
IO.write(a) // expect: arg

View File

@ -1,10 +1,10 @@
fn {
var a = "before"
io.write(a) // expect: before
IO.write(a) // expect: before
a = "after"
io.write(a) // expect: after
IO.write(a) // expect: after
io.write(a = "arg") // expect: arg
io.write(a) // expect: arg
IO.write(a = "arg") // expect: arg
IO.write(a) // expect: arg
}.call

View File

@ -2,10 +2,10 @@
var a = "a"
var b = "b"
a = b = "chain"
io.write(a) // expect: chain
io.write(a) // expect: chain
IO.write(a) // expect: chain
IO.write(a) // expect: chain
// Assignment on RHS of variable.
var c = a = "var"
io.write(a) // expect: var
io.write(c) // expect: var
IO.write(a) // expect: var
IO.write(c) // expect: var

View File

@ -1,23 +1,23 @@
io.write(true == true) // expect: true
io.write(true == false) // expect: false
io.write(false == true) // expect: false
io.write(false == false) // expect: true
IO.write(true == true) // expect: true
IO.write(true == false) // expect: false
IO.write(false == true) // expect: false
IO.write(false == false) // expect: true
// Not equal to other types.
io.write(true == 1) // expect: false
io.write(false == 0) // expect: false
io.write(true == "true") // expect: false
io.write(false == "false") // expect: false
io.write(false == "") // expect: false
IO.write(true == 1) // expect: false
IO.write(false == 0) // expect: false
IO.write(true == "true") // expect: false
IO.write(false == "false") // expect: false
IO.write(false == "") // expect: false
io.write(true != true) // expect: false
io.write(true != false) // expect: true
io.write(false != true) // expect: true
io.write(false != false) // expect: false
IO.write(true != true) // expect: false
IO.write(true != false) // expect: true
IO.write(false != true) // expect: true
IO.write(false != false) // expect: false
// Not equal to other types.
io.write(true != 1) // expect: true
io.write(false != 0) // expect: true
io.write(true != "true") // expect: true
io.write(false != "false") // expect: true
io.write(false != "") // expect: true
IO.write(true != 1) // expect: true
IO.write(false != 0) // expect: true
IO.write(true != "true") // expect: true
IO.write(false != "false") // expect: true
IO.write(false != "") // expect: true

View File

@ -1,3 +1,3 @@
io.write(!true) // expect: false
io.write(!false) // expect: true
io.write(!!true) // expect: true
IO.write(!true) // expect: false
IO.write(!false) // expect: true
IO.write(!!true) // expect: true

View File

@ -1,2 +1,2 @@
io.write(true.toString) // expect: true
io.write(false.toString) // expect: false
IO.write(true.toString) // expect: true
IO.write(false.toString) // expect: false

View File

@ -1,4 +1,4 @@
io.write(true is Bool) // expect: true
io.write(true is Object) // expect: true
io.write(true is Num) // expect: false
io.write(true.type == Bool) // expect: true
IO.write(true is Bool) // expect: true
IO.write(true is Object) // expect: true
IO.write(true is Num) // expect: false
IO.write(true.type == Bool) // expect: true

View File

@ -1,13 +1,13 @@
io.write(Num == Num) // expect: true
io.write(Num == Bool) // expect: false
IO.write(Num == Num) // expect: true
IO.write(Num == Bool) // expect: false
// Not equal to other types.
io.write(Num == 123) // expect: false
io.write(Num == true) // expect: false
IO.write(Num == 123) // expect: false
IO.write(Num == true) // expect: false
io.write(Num != Num) // expect: false
io.write(Num != Bool) // expect: true
IO.write(Num != Num) // expect: false
IO.write(Num != Bool) // expect: true
// Not equal to other types.
io.write(Num != 123) // expect: true
io.write(Num != true) // expect: true
IO.write(Num != 123) // expect: true
IO.write(Num != true) // expect: true

View File

@ -1,10 +1,10 @@
class Foo {
static sayName {
io.write(Foo.toString)
IO.write(Foo.toString)
}
sayName {
io.write(Foo.toString)
IO.write(Foo.toString)
}
static toString { return "Foo!" }

View File

@ -1,6 +1,6 @@
class Foo {}
var foo = new Foo
io.write(foo is Foo) // expect: true
IO.write(foo is Foo) // expect: true
// TODO: Test precedence and grammar of what follows "new".

View File

@ -4,15 +4,15 @@ var g = null
{
var local = "local"
f = fn {
io.write(local)
IO.write(local)
local = "after f"
io.write(local)
IO.write(local)
}
g = fn {
io.write(local)
IO.write(local)
local = "after g"
io.write(local)
IO.write(local)
}
}

View File

@ -2,7 +2,7 @@ var f = null
fn(param) {
f = fn {
io.write(param)
IO.write(param)
}
}.call("param")

View File

@ -3,7 +3,7 @@ var f = null
class Foo {
method(param) {
f = fn {
io.write(param)
IO.write(param)
}
}
}

View File

@ -3,7 +3,7 @@ var f = null
{
var local = "local"
f = fn {
io.write(local)
IO.write(local)
}
}

View File

@ -4,7 +4,7 @@ var foo = null
var local = "local"
class Foo {
method {
io.write(local)
IO.write(local)
}
}

View File

@ -7,9 +7,9 @@ fn {
fn {
var c = "c"
f = fn {
io.write(a)
io.write(b)
io.write(c)
IO.write(a)
IO.write(b)
IO.write(c)
}
}.call
}.call

View File

@ -1,6 +1,6 @@
{
var local = "local"
fn {
io.write(local) // expect: local
IO.write(local) // expect: local
}.call
}

View File

@ -2,7 +2,7 @@
var local = "local"
class Foo {
method {
io.write(local)
IO.write(local)
}
}

View File

@ -3,8 +3,8 @@ var f = null
{
var a = "a"
f = fn {
io.write(a)
io.write(a)
IO.write(a)
IO.write(a)
}
}

View File

@ -3,7 +3,7 @@
{
var a = "a"
f = fn io.write(a)
f = fn IO.write(a)
}
{

View File

@ -2,5 +2,5 @@ var global = "global"
// TODO: Forward reference to global declared after use.
fn {
io.write(global) // expect: global
IO.write(global) // expect: global
}.call

View File

@ -3,11 +3,11 @@ var global = "global"
class Foo {
method {
io.write(global)
IO.write(global)
}
static classMethod {
io.write(global)
IO.write(global)
}
}

View File

@ -1,5 +1,5 @@
// In middle of line.
io.write/* ... */(/* */"ok"/* */) // expect: ok
IO.write/* ... */(/* */"ok"/* */) // expect: ok
// Nested.
io.write(/* in /* nest */ out */"ok") // expect: ok
IO.write(/* in /* nest */ out */"ok") // expect: ok

View File

@ -1,2 +1,2 @@
io.write("ok") // expect: ok
IO.write("ok") // expect: ok
/* comment */

View File

@ -1,2 +1,2 @@
io.write("ok") // expect: ok
IO.write("ok") // expect: ok
// comment

View File

@ -8,4 +8,4 @@
// TODO: What about combining characters?
io.write("ok") // expect: ok
IO.write("ok") // expect: ok

View File

@ -4,5 +4,5 @@ class Foo {
// Classes inherit the argument-less "new" one by default.
var foo = new Foo
io.write(foo is Foo) // expect: true
io.write(foo.toString) // expect: Foo
IO.write(foo is Foo) // expect: true
IO.write(foo.toString) // expect: Foo

View File

@ -2,6 +2,6 @@ class Foo {
+ other { return "Foo " + other }
}
io.write(new Foo + "value") // expect: Foo value
IO.write(new Foo + "value") // expect: Foo value
// TODO: Other expressions following a constructor, like new Foo.bar("arg").

View File

@ -1,7 +1,7 @@
class Foo {
new { io.write("zero") }
new(a) { io.write(a) }
new(a, b) { io.write(a + b) }
new { IO.write("zero") }
new(a) { IO.write(a) }
new(a, b) { IO.write(a + b) }
toString { return "Foo" }
}
@ -13,5 +13,5 @@ new Foo("one", "two") // expect: onetwo
// Returns the new instance.
var foo = new Foo // expect: zero
io.write(foo is Foo) // expect: true
io.write(foo.toString) // expect: Foo
IO.write(foo is Foo) // expect: true
IO.write(foo.toString) // expect: Foo

View File

@ -1,6 +1,6 @@
class A {
new(arg) {
io.write("new A " + arg)
IO.write("new A " + arg)
_field = arg
}
@ -10,7 +10,7 @@ class A {
class B is A {
new(arg1, arg2) {
super(arg2)
io.write("new B " + arg1)
IO.write("new B " + arg1)
_field = arg1
}
@ -20,7 +20,7 @@ class B is A {
class C is B {
new {
super("one", "two")
io.write("new C")
IO.write("new C")
_field = "c"
}
@ -31,10 +31,10 @@ var c = new C
// expect: new A two
// expect: new B one
// expect: new C
io.write(c is A) // expect: true
io.write(c is B) // expect: true
io.write(c is C) // expect: true
IO.write(c is A) // expect: true
IO.write(c is B) // expect: true
IO.write(c is C) // expect: true
io.write(c.aField) // expect: two
io.write(c.bField) // expect: one
io.write(c.cField) // expect: c
IO.write(c.aField) // expect: two
IO.write(c.bField) // expect: one
IO.write(c.cField) // expect: c

View File

@ -1,5 +1,5 @@
class Foo {
write { io.write(_field) }
write { IO.write(_field) }
}
(new Foo).write // expect: null

View File

@ -7,11 +7,11 @@ class Foo {
_e = e
}
write {
io.write(_a)
io.write(_b)
io.write(_c)
io.write(_d)
io.write(_e)
IO.write(_a)
IO.write(_b)
IO.write(_c)
IO.write(_d)
IO.write(_e)
}
}

View File

@ -11,7 +11,7 @@ class Node {
_left.write
}
io.write(_value)
IO.write(_value)
if (_right is Node) {
_right.write

View File

@ -1,5 +1,5 @@
class Foo {
write { io.write(_field) } // Compile a use of the field...
write { IO.write(_field) } // Compile a use of the field...
init { _field = "value" } // ...before an assignment to it.
}

View File

@ -1,16 +1,16 @@
// Not structurally equal.
io.write((fn 123) == (fn 123)) // expect: false
io.write((fn 123) != (fn 123)) // expect: true
IO.write((fn 123) == (fn 123)) // expect: false
IO.write((fn 123) != (fn 123)) // expect: true
// Not equal to other types.
io.write((fn 123) == 1) // expect: false
io.write((fn 123) == false) // expect: false
io.write((fn 123) == "fn 123") // expect: false
io.write((fn 123) != 1) // expect: true
io.write((fn 123) != false) // expect: true
io.write((fn 123) != "fn 123") // expect: true
IO.write((fn 123) == 1) // expect: false
IO.write((fn 123) == false) // expect: false
IO.write((fn 123) == "fn 123") // expect: false
IO.write((fn 123) != 1) // expect: true
IO.write((fn 123) != false) // expect: true
IO.write((fn 123) != "fn 123") // expect: true
// Equal by identity.
var f = fn 123
io.write(f == f) // expect: true
io.write(f != f) // expect: false
IO.write(f == f) // expect: true
IO.write(f != f) // expect: false

View File

@ -1,50 +1,50 @@
var f0 = fn 0
io.write(f0.call) // expect: 0
IO.write(f0.call) // expect: 0
var f1 = fn(a) a
io.write(f1.call(1)) // expect: 1
IO.write(f1.call(1)) // expect: 1
var f2 = fn(a, b) a + b
io.write(f2.call(1, 2)) // expect: 3
IO.write(f2.call(1, 2)) // expect: 3
var f3 = fn(a, b, c) a + b + c
io.write(f3.call(1, 2, 3)) // expect: 6
IO.write(f3.call(1, 2, 3)) // expect: 6
var f4 = fn(a, b, c, d) a + b + c + d
io.write(f4.call(1, 2, 3, 4)) // expect: 10
IO.write(f4.call(1, 2, 3, 4)) // expect: 10
var f5 = fn(a, b, c, d, e) a + b + c + d + e
io.write(f5.call(1, 2, 3, 4, 5)) // expect: 15
IO.write(f5.call(1, 2, 3, 4, 5)) // expect: 15
var f6 = fn(a, b, c, d, e, f) a + b + c + d + e + f
io.write(f6.call(1, 2, 3, 4, 5, 6)) // expect: 21
IO.write(f6.call(1, 2, 3, 4, 5, 6)) // expect: 21
var f7 = fn(a, b, c, d, e, f, g) a + b + c + d + e + f + g
io.write(f7.call(1, 2, 3, 4, 5, 6, 7)) // expect: 28
IO.write(f7.call(1, 2, 3, 4, 5, 6, 7)) // expect: 28
var f8 = fn(a, b, c, d, e, f, g, h) a + b + c + d + e + f + g + h
io.write(f8.call(1, 2, 3, 4, 5, 6, 7, 8)) // expect: 36
IO.write(f8.call(1, 2, 3, 4, 5, 6, 7, 8)) // expect: 36
var f9 = fn(a, b, c, d, e, f, g, h, i) a + b + c + d + e + f + g + h + i
io.write(f9.call(1, 2, 3, 4, 5, 6, 7, 8, 9)) // expect: 45
IO.write(f9.call(1, 2, 3, 4, 5, 6, 7, 8, 9)) // expect: 45
var f10 = fn(a, b, c, d, e, f, g, h, i, j) a + b + c + d + e + f + g + h + i + j
io.write(f10.call(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) // expect: 55
IO.write(f10.call(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) // expect: 55
var f11 = fn(a, b, c, d, e, f, g, h, i, j, k) a + b + c + d + e + f + g + h + i + j + k
io.write(f11.call(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)) // expect: 66
IO.write(f11.call(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)) // expect: 66
var f12 = fn(a, b, c, d, e, f, g, h, i, j, k, l) a + b + c + d + e + f + g + h + i + j + k + l
io.write(f12.call(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)) // expect: 78
IO.write(f12.call(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)) // expect: 78
var f13 = fn(a, b, c, d, e, f, g, h, i, j, k, l, m) a + b + c + d + e + f + g + h + i + j + k + l + m
io.write(f13.call(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)) // expect: 91
IO.write(f13.call(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)) // expect: 91
var f14 = fn(a, b, c, d, e, f, g, h, i, j, k, l, m, n) a + b + c + d + e + f + g + h + i + j + k + l + m + n
io.write(f14.call(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)) // expect: 105
IO.write(f14.call(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)) // expect: 105
var f15 = fn(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) a + b + c + d + e + f + g + h + i + j + k + l + m + n + o
io.write(f15.call(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)) // expect: 120
IO.write(f15.call(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)) // expect: 120
var f16 = fn(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p
io.write(f16.call(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)) // expect: 136
IO.write(f16.call(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)) // expect: 136

View File

@ -1,31 +1,31 @@
// Single expression body.
(fn io.write("ok")).call // expect: ok
(fn IO.write("ok")).call // expect: ok
// TODO: Precedence of fn body.
// Curly body.
fn {
io.write("ok") // expect: ok
IO.write("ok") // expect: ok
}.call
// No trailing newline.
fn {
io.write("ok") }.call // expect: ok
IO.write("ok") }.call // expect: ok
// Multiple expressions.
fn {
io.write("1") // expect: 1
io.write("2") // expect: 2
IO.write("1") // expect: 1
IO.write("2") // expect: 2
}.call
// Extra newlines.
fn {
io.write("1") // expect: 1
IO.write("1") // expect: 1
io.write("2") // expect: 2
IO.write("2") // expect: 2
}.call

View File

@ -1,4 +1,4 @@
io.write((fn 0) is Function) // expect: true
io.write((fn 0) is Object) // expect: true
io.write((fn 0) is String) // expect: false
io.write((fn 0).type == Function) // expect: true
IO.write((fn 0) is Function) // expect: true
IO.write((fn 0) is Object) // expect: true
IO.write((fn 0) is String) // expect: false
IO.write((fn 0).type == Function) // expect: true

View File

@ -1,31 +1,31 @@
// * has higher precedence than +.
io.write(2 + 3 * 4) // expect: 14
IO.write(2 + 3 * 4) // expect: 14
// * has higher precedence than -.
io.write(20 - 3 * 4) // expect: 8
IO.write(20 - 3 * 4) // expect: 8
// / has higher precedence than +.
io.write(2 + 6 / 3) // expect: 4
IO.write(2 + 6 / 3) // expect: 4
// / has higher precedence than -.
io.write(2 - 6 / 3) // expect: 0
IO.write(2 - 6 / 3) // expect: 0
// < has higher precedence than ==.
io.write(false == 2 < 1) // expect: true
IO.write(false == 2 < 1) // expect: true
// > has higher precedence than ==.
io.write(false == 1 > 2) // expect: true
IO.write(false == 1 > 2) // expect: true
// <= has higher precedence than ==.
io.write(false == 2 <= 1) // expect: true
IO.write(false == 2 <= 1) // expect: true
// >= has higher precedence than ==.
io.write(false == 1 >= 2) // expect: true
IO.write(false == 1 >= 2) // expect: true
// Unary - has lower precedence than ..
io.write(-"abc".count) // expect: -3
IO.write(-"abc".count) // expect: -3
// TODO: %, associativity.
// Using () for grouping.
io.write((2 * (6 - (2 + 2)))) // expect: 4
IO.write((2 * (6 - (2 + 2)))) // expect: 4

View File

@ -1,28 +1,28 @@
// Evaluate the 'then' expression if the condition is true.
if (true) io.write("good") // expect: good
if (false) io.write("bad")
if (true) IO.write("good") // expect: good
if (false) IO.write("bad")
// Evaluate the 'else' expression if the condition is false.
if (true) io.write("good") else io.write("bad") // expect: good
if (false) io.write("bad") else io.write("good") // expect: good
if (true) IO.write("good") else IO.write("bad") // expect: good
if (false) IO.write("bad") else IO.write("good") // expect: good
// Allow blocks for branches.
if (true) { io.write("block") } // expect: block
if (false) null else { io.write("block") } // expect: block
if (true) { IO.write("block") } // expect: block
if (false) null else { IO.write("block") } // expect: block
// Assignment in if condition.
var a = false
if (a = true) io.write(a) // expect: true
if (a = true) IO.write(a) // expect: true
// Newline after "if".
if
(true) io.write("good") // expect: good
(true) IO.write("good") // expect: good
// Newline after "else".
if (false) io.write("bad") else
io.write("good") // expect: good
if (false) IO.write("bad") else
IO.write("good") // expect: good
// Only false is falsy.
if (0) io.write(0) // expect: 0
if (null) io.write(null) // expect: null
if ("") io.write("empty") // expect: empty
if (0) IO.write(0) // expect: 0
if (null) IO.write(null) // expect: null
if ("") IO.write("empty") // expect: empty

View File

@ -5,8 +5,8 @@ class Foo {
}
fooPrint {
io.write(_field1)
io.write(_field2)
IO.write(_field1)
IO.write(_field2)
}
}
@ -17,8 +17,8 @@ class Bar is Foo {
}
barPrint {
io.write(_field1)
io.write(_field2)
IO.write(_field1)
IO.write(_field2)
}
}

View File

@ -1,15 +1,15 @@
class Foo {
methodOnFoo { io.write("foo") }
method(a) { io.write("foo") }
method(a, b, c) { io.write("foo") }
override { io.write("foo") }
methodOnFoo { IO.write("foo") }
method(a) { IO.write("foo") }
method(a, b, c) { IO.write("foo") }
override { IO.write("foo") }
}
class Bar is Foo {
methodOnBar { io.write("bar") }
method(a, b) { io.write("bar") }
method(a, b, c, d) { io.write("bar") }
override { io.write("bar") }
methodOnBar { IO.write("bar") }
method(a, b) { IO.write("bar") }
method(a, b, c, d) { IO.write("bar") }
override { IO.write("bar") }
}
var bar = new Bar

View File

@ -1,15 +1,15 @@
class Foo {
static methodOnFoo { io.write("foo") }
static method(a) { io.write("foo") }
static method(a, b, c) { io.write("foo") }
static override { io.write("foo") }
static methodOnFoo { IO.write("foo") }
static method(a) { IO.write("foo") }
static method(a, b, c) { IO.write("foo") }
static override { IO.write("foo") }
}
class Bar is Foo {
static methodOnBar { io.write("bar") }
static method(a, b) { io.write("bar") }
static method(a, b, c, d) { io.write("bar") }
static override { io.write("bar") }
static methodOnBar { IO.write("bar") }
static method(a, b) { IO.write("bar") }
static method(a, b, c, d) { IO.write("bar") }
static override { IO.write("bar") }
}
Bar.methodOnFoo // expect: foo

View File

@ -5,12 +5,12 @@ var a = new A
var b = new B
var c = new C
io.write(a is A) // expect: true
io.write(a is B) // expect: false
io.write(a is C) // expect: false
io.write(b is A) // expect: true
io.write(b is B) // expect: true
io.write(b is C) // expect: false
io.write(c is A) // expect: true
io.write(c is B) // expect: true
io.write(c is C) // expect: true
IO.write(a is A) // expect: true
IO.write(a is B) // expect: false
IO.write(a is C) // expect: false
IO.write(b is A) // expect: true
IO.write(b is B) // expect: true
IO.write(b is C) // expect: false
IO.write(c is A) // expect: true
IO.write(c is B) // expect: true
IO.write(c is C) // expect: true

View File

@ -1,32 +1,32 @@
io.write(Num is Class) // expect: true
io.write(true is Bool) // expect: true
io.write((fn 1) is Function) // expect: true
io.write(123 is Num) // expect: true
io.write(null is Null) // expect: true
io.write("s" is String) // expect: true
IO.write(Num is Class) // expect: true
IO.write(true is Bool) // expect: true
IO.write((fn 1) is Function) // expect: true
IO.write(123 is Num) // expect: true
IO.write(null is Null) // expect: true
IO.write("s" is String) // expect: true
io.write(Num is Bool) // expect: false
io.write(null is Class) // expect: false
io.write(true is Function) // expect: false
io.write((fn 1) is Num) // expect: false
io.write("s" is Null) // expect: false
io.write(123 is String) // expect: false
IO.write(Num is Bool) // expect: false
IO.write(null is Class) // expect: false
IO.write(true is Function) // expect: false
IO.write((fn 1) is Num) // expect: false
IO.write("s" is Null) // expect: false
IO.write(123 is String) // expect: false
// Everything extends Object.
io.write(Num is Object) // expect: true
io.write(null is Object) // expect: true
io.write(true is Object) // expect: true
io.write((fn 1) is Object) // expect: true
io.write("s" is Object) // expect: true
io.write(123 is Object) // expect: true
IO.write(Num is Object) // expect: true
IO.write(null is Object) // expect: true
IO.write(true is Object) // expect: true
IO.write((fn 1) is Object) // expect: true
IO.write("s" is Object) // expect: true
IO.write(123 is Object) // expect: true
// Classes extend Class.
io.write(Num is Class) // expect: true
io.write(null is Class) // expect: false
io.write(true is Class) // expect: false
io.write((fn 1) is Class) // expect: false
io.write("s" is Class) // expect: false
io.write(123 is Class) // expect: false
IO.write(Num is Class) // expect: true
IO.write(null is Class) // expect: false
IO.write(true is Class) // expect: false
IO.write((fn 1) is Class) // expect: false
IO.write("s" is Class) // expect: false
IO.write(123 is Class) // expect: false
// TODO: Non-class on RHS.
// TODO: Precedence and associativity.

View File

@ -1,10 +1,10 @@
var a = []
a.add(1)
io.write(a) // expect: [1]
IO.write(a) // expect: [1]
a.add(2)
io.write(a) // expect: [1, 2]
IO.write(a) // expect: [1, 2]
a.add(3)
io.write(a) // expect: [1, 2, 3]
IO.write(a) // expect: [1, 2, 3]
// Returns added element.
io.write(a.add(4)) // expect: 4
IO.write(a.add(4)) // expect: 4

View File

@ -1,7 +1,7 @@
var a = [1, 2, 3]
a.clear
io.write(a) // expect: []
io.write(a.count) // expect: 0
IO.write(a) // expect: []
IO.write(a.count) // expect: 0
// Returns null.
io.write([1, 2].clear) // expect: null
IO.write([1, 2].clear) // expect: null

View File

@ -1,3 +1,3 @@
io.write([].count) // expect: 0
io.write([1].count) // expect: 1
io.write([1, 2, 3, 4].count) // expect: 4
IO.write([].count) // expect: 0
IO.write([1].count) // expect: 1
IO.write([1, 2, 3, 4].count) // expect: 4

View File

@ -4,41 +4,41 @@
// Add to empty list.
var a = []
a.insert(1, 0)
io.write(a) // expect: [1]
IO.write(a) // expect: [1]
// Normal indices.
var b = [1, 2, 3]
b.insert(4, 0)
io.write(b) // expect: [4, 1, 2, 3]
IO.write(b) // expect: [4, 1, 2, 3]
var c = [1, 2, 3]
c.insert(4, 1)
io.write(c) // expect: [1, 4, 2, 3]
IO.write(c) // expect: [1, 4, 2, 3]
var d = [1, 2, 3]
d.insert(4, 2)
io.write(d) // expect: [1, 2, 4, 3]
IO.write(d) // expect: [1, 2, 4, 3]
var e = [1, 2, 3]
e.insert(4, 3)
io.write(e) // expect: [1, 2, 3, 4]
IO.write(e) // expect: [1, 2, 3, 4]
// Negative indices.
var f = [1, 2, 3]
f.insert(4, -4)
io.write(f) // expect: [4, 1, 2, 3]
IO.write(f) // expect: [4, 1, 2, 3]
var g = [1, 2, 3]
g.insert(4, -3)
io.write(g) // expect: [1, 4, 2, 3]
IO.write(g) // expect: [1, 4, 2, 3]
var h = [1, 2, 3]
h.insert(4, -2)
io.write(h) // expect: [1, 2, 4, 3]
IO.write(h) // expect: [1, 2, 4, 3]
var i = [1, 2, 3]
i.insert(4, -1)
io.write(i) // expect: [1, 2, 3, 4]
IO.write(i) // expect: [1, 2, 3, 4]
// Returns.inserted value.
io.write([1, 2].insert(3, 0)) // expect: 3
IO.write([1, 2].insert(3, 0)) // expect: 3

View File

@ -8,7 +8,7 @@ var list = [
]
io.write(list[0]) // expect: a
io.write(list[1]) // expect: b
io.write(list[2]) // expect: c
io.write(list[3]) // expect: d
IO.write(list[0]) // expect: a
IO.write(list[1]) // expect: b
IO.write(list[2]) // expect: c
IO.write(list[3]) // expect: d

View File

@ -1,32 +1,32 @@
var a = [1, 2, 3]
a.removeAt(0)
io.write(a) // expect: [2, 3]
IO.write(a) // expect: [2, 3]
var b = [1, 2, 3]
b.removeAt(1)
io.write(b) // expect: [1, 3]
IO.write(b) // expect: [1, 3]
var c = [1, 2, 3]
c.removeAt(2)
io.write(c) // expect: [1, 2]
IO.write(c) // expect: [1, 2]
// Index backwards from end.
var d = [1, 2, 3]
d.removeAt(-3)
io.write(d) // expect: [2, 3]
IO.write(d) // expect: [2, 3]
var e = [1, 2, 3]
e.removeAt(-2)
io.write(e) // expect: [1, 3]
IO.write(e) // expect: [1, 3]
var f = [1, 2, 3]
f.removeAt(-1)
io.write(f) // expect: [1, 2]
IO.write(f) // expect: [1, 2]
// Out of bounds.
// TODO: Signal error in better way.
io.write([1, 2, 3].removeAt(3)) // expect: null
io.write([1, 2, 3].removeAt(-4)) // expect: null
IO.write([1, 2, 3].removeAt(3)) // expect: null
IO.write([1, 2, 3].removeAt(-4)) // expect: null
// Return the removed value.
io.write([3, 4, 5].removeAt(1)) // expect: 4
IO.write([3, 4, 5].removeAt(1)) // expect: 4

View File

@ -1,25 +1,25 @@
// Returns elements.
var list = ["a", "b", "c", "d"]
io.write(list[0]) // expect: a
io.write(list[1]) // expect: b
io.write(list[2]) // expect: c
io.write(list[3]) // expect: d
IO.write(list[0]) // expect: a
IO.write(list[1]) // expect: b
IO.write(list[2]) // expect: c
IO.write(list[3]) // expect: d
// Allows indexing backwards from the end.
io.write(list[-4]) // expect: a
io.write(list[-3]) // expect: b
io.write(list[-2]) // expect: c
io.write(list[-1]) // expect: d
IO.write(list[-4]) // expect: a
IO.write(list[-3]) // expect: b
IO.write(list[-2]) // expect: c
IO.write(list[-1]) // expect: d
// Handle out of bounds.
// TODO: Should halt the fiber or raise an error somehow.
io.write(list[4]) // expect: null
io.write(list[-5]) // expect: null
IO.write(list[4]) // expect: null
IO.write(list[-5]) // expect: null
// Handle wrong argument type.
// TODO: Should halt the fiber or raise an error somehow.
io.write(list[true]) // expect: null
IO.write(list[true]) // expect: null
// Handle non-integer index.
// TODO: Should halt the fiber or raise an error somehow.
io.write(list[1.5]) // expect: null
IO.write(list[1.5]) // expect: null

View File

@ -4,13 +4,13 @@
list[0] = 5
list[1] = 6
list[2] = 7
io.write(list) // expect: [5, 6, 7]
IO.write(list) // expect: [5, 6, 7]
}
// Returns right-hand side.
{
var list = [1, 2, 3]
io.write(list[1] = 5) // expect: 5
IO.write(list[1] = 5) // expect: 5
}
// Negative indices.
@ -19,7 +19,7 @@
list[-1] = 5
list[-2] = 6
list[-3] = 7
io.write(list) // expect: [7, 6, 5]
IO.write(list) // expect: [7, 6, 5]
}
// TODO: Handle out of range.

View File

@ -1,4 +1,4 @@
io.write([] is List) // expect: true
io.write([] is Object) // expect: true
io.write([] is Bool) // expect: false
io.write([].type == List) // expect: true
IO.write([] is List) // expect: true
IO.write([] is Object) // expect: true
IO.write([] is Bool) // expect: false
IO.write([].type == List) // expect: true

View File

@ -19,20 +19,20 @@ class Foo {
}
var foo = new Foo
io.write(foo.method) // expect: 0
io.write(foo.method(1)) // expect: 1
io.write(foo.method(1, 2)) // expect: 3
io.write(foo.method(1, 2, 3)) // expect: 6
io.write(foo.method(1, 2, 3, 4)) // expect: 10
io.write(foo.method(1, 2, 3, 4, 5)) // expect: 15
io.write(foo.method(1, 2, 3, 4, 5, 6)) // expect: 21
io.write(foo.method(1, 2, 3, 4, 5, 6, 7)) // expect: 28
io.write(foo.method(1, 2, 3, 4, 5, 6, 7, 8)) // expect: 36
io.write(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9)) // expect: 45
io.write(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) // expect: 55
io.write(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)) // expect: 66
io.write(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)) // expect: 78
io.write(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)) // expect: 91
io.write(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)) // expect: 105
io.write(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)) // expect: 120
io.write(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)) // expect: 136
IO.write(foo.method) // expect: 0
IO.write(foo.method(1)) // expect: 1
IO.write(foo.method(1, 2)) // expect: 3
IO.write(foo.method(1, 2, 3)) // expect: 6
IO.write(foo.method(1, 2, 3, 4)) // expect: 10
IO.write(foo.method(1, 2, 3, 4, 5)) // expect: 15
IO.write(foo.method(1, 2, 3, 4, 5, 6)) // expect: 21
IO.write(foo.method(1, 2, 3, 4, 5, 6, 7)) // expect: 28
IO.write(foo.method(1, 2, 3, 4, 5, 6, 7, 8)) // expect: 36
IO.write(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9)) // expect: 45
IO.write(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) // expect: 55
IO.write(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)) // expect: 66
IO.write(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)) // expect: 78
IO.write(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)) // expect: 91
IO.write(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)) // expect: 105
IO.write(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)) // expect: 120
IO.write(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)) // expect: 136

View File

@ -4,4 +4,4 @@ class Foo {
}
}
io.write((new Foo).thisHasAMethodNameThatIsExactly64CharactersLongWhichIsTheMaximum) // expect: result
IO.write((new Foo).thisHasAMethodNameThatIsExactly64CharactersLongWhichIsTheMaximum) // expect: result

View File

@ -16,16 +16,16 @@ class Foo {
}
var foo = new Foo
io.write(foo + "a") // expect: infix + a
io.write(foo - "a") // expect: infix - a
io.write(foo * "a") // expect: infix * a
io.write(foo / "a") // expect: infix / a
io.write(foo % "a") // expect: infix % a
io.write(foo < "a") // expect: infix < a
io.write(foo > "a") // expect: infix > a
io.write(foo <= "a") // expect: infix <= a
io.write(foo >= "a") // expect: infix >= a
io.write(foo == "a") // expect: infix == a
io.write(foo != "a") // expect: infix != a
io.write(!foo) // expect: prefix !
io.write(-foo) // expect: prefix -
IO.write(foo + "a") // expect: infix + a
IO.write(foo - "a") // expect: infix - a
IO.write(foo * "a") // expect: infix * a
IO.write(foo / "a") // expect: infix / a
IO.write(foo % "a") // expect: infix % a
IO.write(foo < "a") // expect: infix < a
IO.write(foo > "a") // expect: infix > a
IO.write(foo <= "a") // expect: infix <= a
IO.write(foo >= "a") // expect: infix >= a
IO.write(foo == "a") // expect: infix == a
IO.write(foo != "a") // expect: infix != a
IO.write(!foo) // expect: prefix !
IO.write(-foo) // expect: prefix -

View File

@ -6,7 +6,7 @@ class Foo {
static bar(arg) { return "on metaclass " + arg }
}
io.write((new Foo).bar) // expect: on instance
io.write(Foo.bar) // expect: on metaclass
io.write((new Foo).bar("arg")) // expect: on instance arg
io.write(Foo.bar("arg")) // expect: on metaclass arg
IO.write((new Foo).bar) // expect: on instance
IO.write(Foo.bar) // expect: on metaclass
IO.write((new Foo).bar("arg")) // expect: on instance arg
IO.write(Foo.bar("arg")) // expect: on metaclass arg

View File

@ -1 +1 @@
io.write(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17) // expect error
IO.write(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17) // expect error

View File

@ -1 +1 @@
io.write("ok") // expect: ok
IO.write("ok") // expect: ok

View File

@ -1 +1 @@
io.write(null) // expect: null
IO.write(null) // expect: null

View File

@ -1,4 +1,4 @@
io.write(null is Null) // expect: true
io.write(null is Object) // expect: true
io.write(null is Bool) // expect: false
io.write(null.type == Null) // expect: true
IO.write(null is Null) // expect: true
IO.write(null is Object) // expect: true
IO.write(null is Bool) // expect: false
IO.write(null.type == Null) // expect: true

View File

@ -1,6 +1,6 @@
io.write(123.abs) // expect: 123
io.write(-123.abs) // expect: 123
io.write(0.abs) // expect: 0
io.write(-0.abs) // expect: 0
io.write(-0.12.abs) // expect: 0.12
io.write(12.34.abs) // expect: 12.34
IO.write(123.abs) // expect: 123
IO.write(-123.abs) // expect: 123
IO.write(0.abs) // expect: 0
IO.write(-0.abs) // expect: 0
IO.write(-0.12.abs) // expect: 0.12
IO.write(12.34.abs) // expect: 12.34

View File

@ -1,22 +1,22 @@
io.write(~0) // expect: 4294967295
io.write(~1) // expect: 4294967294
io.write(~23) // expect: 4294967272
IO.write(~0) // expect: 4294967295
IO.write(~1) // expect: 4294967294
IO.write(~23) // expect: 4294967272
// Max u32 value.
io.write(~4294967295) // expect: 0
IO.write(~4294967295) // expect: 0
// Past max u32 value.
io.write(~4294967296) // expect: 4294967295
IO.write(~4294967296) // expect: 4294967295
// Negative numbers.
io.write(~-1) // expect: 0
io.write(~-123) // expect: 122
io.write(~-4294967294) // expect: 4294967293
io.write(~-4294967295) // expect: 4294967294
io.write(~-4294967296) // expect: 4294967295
IO.write(~-1) // expect: 0
IO.write(~-123) // expect: 122
IO.write(~-4294967294) // expect: 4294967293
IO.write(~-4294967295) // expect: 4294967294
IO.write(~-4294967296) // expect: 4294967295
// Floating point values.
io.write(~1.23) // expect: 4294967294
io.write(~0.00123) // expect: 4294967295
io.write(~345.67) // expect: 4294966950
io.write(~-12.34) // expect: 11
IO.write(~1.23) // expect: 4294967294
IO.write(~0.00123) // expect: 4294967295
IO.write(~345.67) // expect: 4294966950
IO.write(~-12.34) // expect: 11

View File

@ -1,27 +1,27 @@
io.write(1 < 2) // expect: true
io.write(2 < 2) // expect: false
io.write(2 < 1) // expect: false
IO.write(1 < 2) // expect: true
IO.write(2 < 2) // expect: false
IO.write(2 < 1) // expect: false
io.write(1 <= 2) // expect: true
io.write(2 <= 2) // expect: true
io.write(2 <= 1) // expect: false
IO.write(1 <= 2) // expect: true
IO.write(2 <= 2) // expect: true
IO.write(2 <= 1) // expect: false
io.write(1 > 2) // expect: false
io.write(2 > 2) // expect: false
io.write(2 > 1) // expect: true
IO.write(1 > 2) // expect: false
IO.write(2 > 2) // expect: false
IO.write(2 > 1) // expect: true
io.write(1 >= 2) // expect: false
io.write(2 >= 2) // expect: true
io.write(2 >= 1) // expect: true
IO.write(1 >= 2) // expect: false
IO.write(2 >= 2) // expect: true
IO.write(2 >= 1) // expect: true
// Zero and negative zero compare the same.
io.write(0 < -0) // expect: false
io.write(-0 < 0) // expect: false
io.write(0 > -0) // expect: false
io.write(-0 > 0) // expect: false
io.write(0 <= -0) // expect: true
io.write(-0 <= 0) // expect: true
io.write(0 >= -0) // expect: true
io.write(-0 >= 0) // expect: true
IO.write(0 < -0) // expect: false
IO.write(-0 < 0) // expect: false
IO.write(0 > -0) // expect: false
IO.write(-0 > 0) // expect: false
IO.write(0 <= -0) // expect: true
IO.write(-0 <= 0) // expect: true
IO.write(0 >= -0) // expect: true
IO.write(-0 >= 0) // expect: true
// TODO: Wrong type for RHS.

View File

@ -1,5 +1,5 @@
io.write(8 / 2) // expect: 4
io.write(12.34 / -0.4) // expect: -30.85
IO.write(8 / 2) // expect: 4
IO.write(12.34 / -0.4) // expect: -30.85
// TODO: Unsupported RHS types.
// TODO: Divide by zero.

View File

@ -1,19 +1,19 @@
io.write(123 == 123) // expect: true
io.write(123 == 124) // expect: false
io.write(-3 == 3) // expect: false
io.write(0 == -0) // expect: true
IO.write(123 == 123) // expect: true
IO.write(123 == 124) // expect: false
IO.write(-3 == 3) // expect: false
IO.write(0 == -0) // expect: true
// Not equal to other types.
io.write(123 == "123") // expect: false
io.write(1 == true) // expect: false
io.write(0 == false) // expect: false
IO.write(123 == "123") // expect: false
IO.write(1 == true) // expect: false
IO.write(0 == false) // expect: false
io.write(123 != 123) // expect: false
io.write(123 != 124) // expect: true
io.write(-3 != 3) // expect: true
io.write(0 != -0) // expect: false
IO.write(123 != 123) // expect: false
IO.write(123 != 124) // expect: true
IO.write(-3 != 3) // expect: true
IO.write(0 != -0) // expect: false
// Not equal to other types.
io.write(123 != "123") // expect: true
io.write(1 != true) // expect: true
io.write(0 != false) // expect: true
IO.write(123 != "123") // expect: true
IO.write(1 != true) // expect: true
IO.write(0 != false) // expect: true

View File

@ -1,10 +1,10 @@
io.write(123) // expect: 123
io.write(987654) // expect: 987654
io.write(0) // expect: 0
io.write(-0) // expect: -0
IO.write(123) // expect: 123
IO.write(987654) // expect: 987654
IO.write(0) // expect: 0
IO.write(-0) // expect: -0
io.write(123.456) // expect: 123.456
io.write(-0.001) // expect: -0.001
IO.write(123.456) // expect: 123.456
IO.write(-0.001) // expect: -0.001
// TODO: Hex? Scientific notation?
// TODO: Literals at and beyond numeric limits.

View File

@ -1,10 +1,10 @@
// Infix.
io.write(5 - 3) // expect: 2
io.write(3.1 - 0.24) // expect: 2.86
io.write(3 - 2 - 1) // expect: 0
IO.write(5 - 3) // expect: 2
IO.write(3.1 - 0.24) // expect: 2.86
IO.write(3 - 2 - 1) // expect: 0
// Unary negation.
var a = 3
io.write(-a) // expect: -3
IO.write(-a) // expect: -3
// TODO: Unsupported RHS types.

View File

@ -1,14 +1,14 @@
io.write(5 % 3) // expect: 2
io.write(10 % 5) // expect: 0
io.write(-4 % 3) // expect: -1
io.write(4 % -3) // expect: 1
io.write(-4 % -3) // expect: -1
io.write(-4.2 % 3.1) // expect: -1.1
io.write(4.2 % -3.1) // expect: 1.1
io.write(-4.2 % -3.1) // expect: -1.1
IO.write(5 % 3) // expect: 2
IO.write(10 % 5) // expect: 0
IO.write(-4 % 3) // expect: -1
IO.write(4 % -3) // expect: 1
IO.write(-4 % -3) // expect: -1
IO.write(-4.2 % 3.1) // expect: -1.1
IO.write(4.2 % -3.1) // expect: 1.1
IO.write(-4.2 % -3.1) // expect: -1.1
// Left associative.
io.write(13 % 7 % 4) // expect: 2
IO.write(13 % 7 % 4) // expect: 2
// TODO: Unsupported RHS types.
// TODO: Error on mod by zero.

View File

@ -1,4 +1,4 @@
io.write(5 * 3) // expect: 15
io.write(12.34 * 0.3) // expect: 3.702
IO.write(5 * 3) // expect: 15
IO.write(12.34 * 0.3) // expect: 3.702
// TODO: Unsupported RHS types.

View File

@ -1,5 +1,5 @@
io.write(1 + 2) // expect: 3
io.write(12.34 + 0.13) // expect: 12.47
io.write(3 + 5 + 2) // expect: 10
IO.write(1 + 2) // expect: 3
IO.write(12.34 + 0.13) // expect: 12.47
IO.write(3 + 5 + 2) // expect: 10
// TODO: Unsupported RHS types.

View File

@ -1,5 +1,5 @@
io.write(123.toString == "123") // expect: true
io.write(-123.toString == "-123") // expect: true
io.write(-0.toString == "-0") // expect: true
io.write(12.34.toString == "12.34") // expect: true
io.write(-0.0001.toString == "-0.0001") // expect: true
IO.write(123.toString == "123") // expect: true
IO.write(-123.toString == "-123") // expect: true
IO.write(-0.toString == "-0") // expect: true
IO.write(12.34.toString == "12.34") // expect: true
IO.write(-0.0001.toString == "-0.0001") // expect: true

View File

@ -1,4 +1,4 @@
io.write(123 is Num) // expect: true
io.write(123 is Object) // expect: true
io.write(123 is String) // expect: false
io.write(123.type == Num) // expect: true
IO.write(123 is Num) // expect: true
IO.write(123 is Object) // expect: true
IO.write(123 is String) // expect: false
IO.write(123.type == Num) // expect: true

View File

@ -1,26 +1,26 @@
// Note: These tests implicitly depend on ints being truthy.
// Also rely on io.write() returning its argument.
// Also rely on IO.write() returning its argument.
// Return the first true argument.
io.write(1 || true) // expect: 1
io.write(false || 1) // expect: 1
io.write(false || false || true) // expect: true
IO.write(1 || true) // expect: 1
IO.write(false || 1) // expect: 1
IO.write(false || false || true) // expect: true
// Return the last argument if all are false.
io.write(false || false) // expect: false
io.write(false || false || false) // expect: false
IO.write(false || false) // expect: false
IO.write(false || false || false) // expect: false
// Short-circuit at the first true argument.
io.write(false) || // expect: false
io.write(true) || // expect: true
io.write(true) // should not print
IO.write(false) || // expect: false
IO.write(true) || // expect: true
IO.write(true) // should not print
// Swallow a trailing newline.
io.write(true ||
IO.write(true ||
true) // expect: true
// Only false is falsy.
io.write(0 || true) // expect: 0
io.write(null || true) // expect: null
io.write(("" || true) == "") // expect: true
io.write(false || true) // expect: true
IO.write(0 || true) // expect: 0
IO.write(null || true) // expect: null
IO.write(("" || true) == "") // expect: true
IO.write(false || true) // expect: true

View File

@ -1 +1 @@
var a = "ok"; io.write(a) // expect: ok
var a = "ok"; IO.write(a) // expect: ok

View File

@ -13,6 +13,6 @@ var c = new Foo("c")
// Assignment is right-associative.
a.bar = b.bar = c.bar = "d"
io.write(a.toString) // expect: d
io.write(b.toString) // expect: d
io.write(c.toString) // expect: d
IO.write(a.toString) // expect: d
IO.write(b.toString) // expect: d
IO.write(c.toString) // expect: d

View File

@ -1,6 +1,6 @@
class Foo {
bar = value {
io.write(value)
IO.write(value)
}
}

View File

@ -3,4 +3,4 @@ class Foo {
}
var foo = new Foo
io.write(foo.bar = "value") // expect: result
IO.write(foo.bar = "value") // expect: result

View File

@ -1,6 +1,6 @@
class Foo {
bar = value { io.write("set") }
bar { io.write("get") }
bar = value { IO.write("set") }
bar { IO.write("get") }
}
var foo = new Foo

View File

@ -1,6 +1,6 @@
class Foo {
static bar = value {
io.write(value)
IO.write(value)
}
}

View File

@ -1,8 +1,8 @@
io.write("".contains("")) // expect: true
io.write("anything".contains("")) // expect: true
io.write("something".contains("meth")) // expect: true
io.write("something".contains("some")) // expect: true
io.write("something".contains("ing")) // expect: true
io.write("something".contains("math")) // expect: false
IO.write("".contains("")) // expect: true
IO.write("anything".contains("")) // expect: true
IO.write("something".contains("meth")) // expect: true
IO.write("something".contains("some")) // expect: true
IO.write("something".contains("ing")) // expect: true
IO.write("something".contains("math")) // expect: false
// TODO: Passing non-string as argument.

View File

@ -1,2 +1,2 @@
io.write("".count) // expect: 0
io.write("a string".count) // expect: 8
IO.write("".count) // expect: 0
IO.write("a string".count) // expect: 8

View File

@ -1,19 +1,19 @@
io.write("" == "") // expect: true
io.write("abcd" == "abcd") // expect: true
io.write("abcd" == "d") // expect: false
io.write("e" == "abcd") // expect: false
io.write("" == "abcd") // expect: false
IO.write("" == "") // expect: true
IO.write("abcd" == "abcd") // expect: true
IO.write("abcd" == "d") // expect: false
IO.write("e" == "abcd") // expect: false
IO.write("" == "abcd") // expect: false
// Not equal to other types.
io.write("1" == 1) // expect: false
io.write("true" == true) // expect: false
IO.write("1" == 1) // expect: false
IO.write("true" == true) // expect: false
io.write("" != "") // expect: false
io.write("abcd" != "abcd") // expect: false
io.write("abcd" != "d") // expect: true
io.write("e" != "abcd") // expect: true
io.write("" != "abcd") // expect: true
IO.write("" != "") // expect: false
IO.write("abcd" != "abcd") // expect: false
IO.write("abcd" != "d") // expect: true
IO.write("e" != "abcd") // expect: true
IO.write("" != "abcd") // expect: true
// Not equal to other types.
io.write("1" != 1) // expect: true
io.write("true" != true) // expect: true
IO.write("1" != 1) // expect: true
IO.write("true" != true) // expect: true

View File

@ -1,7 +1,7 @@
// Escape characters.
io.write("\"") // expect: "
io.write("\\") // expect: \
io.write("(\n)") // expect: (
IO.write("\"") // expect: "
IO.write("\\") // expect: \
IO.write("(\n)") // expect: (
// expect: )
// TODO: Non-printing escapes like \t.

View File

@ -1,2 +1,2 @@
io.write("".count) // expect: 0
io.write("a string") // expect: a string
IO.write("".count) // expect: 0
IO.write("a string") // expect: a string

View File

@ -1,24 +1,24 @@
// Returns characters (as strings).
io.write("abcd"[0]) // expect: a
io.write("abcd"[1]) // expect: b
io.write("abcd"[2]) // expect: c
io.write("abcd"[3]) // expect: d
IO.write("abcd"[0]) // expect: a
IO.write("abcd"[1]) // expect: b
IO.write("abcd"[2]) // expect: c
IO.write("abcd"[3]) // expect: d
// Allows indexing backwards from the end.
io.write("abcd"[-4]) // expect: a
io.write("abcd"[-3]) // expect: b
io.write("abcd"[-2]) // expect: c
io.write("abcd"[-1]) // expect: d
IO.write("abcd"[-4]) // expect: a
IO.write("abcd"[-3]) // expect: b
IO.write("abcd"[-2]) // expect: c
IO.write("abcd"[-1]) // expect: d
// Handle out of bounds.
// TODO: Should halt the fiber or raise an error somehow.
io.write("abcd"[4]) // expect: null
io.write("abcd"[-5]) // expect: null
IO.write("abcd"[4]) // expect: null
IO.write("abcd"[-5]) // expect: null
// Handle wrong argument type.
// TODO: Should halt the fiber or raise an error somehow.
io.write("abcd"[true]) // expect: null
IO.write("abcd"[true]) // expect: null
// Handle non-integer index.
// TODO: Should halt the fiber or raise an error somehow.
io.write("abcd"[1.5]) // expect: null
IO.write("abcd"[1.5]) // expect: null

View File

@ -1,2 +1,2 @@
io.write("".toString == "") // expect: true
io.write("blah".toString == "blah") // expect: true
IO.write("".toString == "") // expect: true
IO.write("blah".toString == "blah") // expect: true

View File

@ -1,4 +1,4 @@
io.write("s" is String) // expect: true
io.write("s" is Object) // expect: true
io.write("s" is Num) // expect: false
io.write("s".type == String) // expect: true
IO.write("s" is String) // expect: true
IO.write("s" is Object) // expect: true
IO.write("s" is Num) // expect: false
IO.write("s".type == String) // expect: true

View File

@ -1,12 +1,12 @@
class Base {
foo {
io.write("Base.foo")
IO.write("Base.foo")
}
}
class Derived is Base {
bar {
io.write("Derived.bar")
IO.write("Derived.bar")
super.foo
}
}

View File

@ -1,12 +1,12 @@
class Base {
foo {
io.write("Base.foo")
IO.write("Base.foo")
}
}
class Derived is Base {
foo {
io.write("Derived.foo")
IO.write("Derived.foo")
super.foo
}
}

View File

@ -1,6 +1,6 @@
class A {
foo {
io.write("A.foo")
IO.write("A.foo")
}
}
@ -8,7 +8,7 @@ class B is A {}
class C is B {
foo {
io.write("C.foo")
IO.write("C.foo")
super.foo
}
}

View File

@ -9,4 +9,4 @@ class Foo {
}
var closure = (new Foo).getClosure
io.write(closure.call) // expect: Foo
IO.write(closure.call) // expect: Foo

Some files were not shown because too many files have changed in this diff Show More