feat: rename IO.write to IO.print and add Unicode escape support in strings

Rename the IO.write method to IO.print, which now prints without a trailing newline, and add a new IO.print method that appends a newline after output. Update all benchmark, example, and test files to use IO.print instead of IO.write. Additionally, implement Unicode escape sequence parsing in the compiler's string tokenizer, supporting \uXXXX and \u{...} syntax with proper UTF-8 encoding for code points up to U+10FFFF.
This commit is contained in:
Bob Nystrom
2014-01-05 20:27:12 +00:00
parent e23e0ce6a3
commit c72db7d594
159 changed files with 1690 additions and 1599 deletions
+14 -14
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.print() 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.print(false && 1) // expect: false
IO.print(true && 1) // expect: 1
IO.print(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.print(1 && true) // expect: true
IO.print(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.print(true) && // expect: true
IO.print(false) && // expect: false
IO.print(false) // should not print
// Swallow a trailing newline.
IO.write(true &&
IO.print(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.print(0 && true) // expect: true
IO.print(null && true) // expect: true
IO.print("" && true) // expect: true
IO.print(false && true) // expect: false
+3 -3
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.print(a) // expect: c
IO.print(b) // expect: c
IO.print(c) // expect: c
+4 -4
View File
@@ -1,8 +1,8 @@
var a = "before"
IO.write(a) // expect: before
IO.print(a) // expect: before
a = "after"
IO.write(a) // expect: after
IO.print(a) // expect: after
IO.write(a = "arg") // expect: arg
IO.write(a) // expect: arg
IO.print(a = "arg") // expect: arg
IO.print(a) // expect: arg
+4 -4
View File
@@ -1,10 +1,10 @@
fn {
var a = "before"
IO.write(a) // expect: before
IO.print(a) // expect: before
a = "after"
IO.write(a) // expect: after
IO.print(a) // expect: after
IO.write(a = "arg") // expect: arg
IO.write(a) // expect: arg
IO.print(a = "arg") // expect: arg
IO.print(a) // expect: arg
}.call
+4 -4
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.print(a) // expect: chain
IO.print(a) // expect: chain
// Assignment on RHS of variable.
var c = a = "var"
IO.write(a) // expect: var
IO.write(c) // expect: var
IO.print(a) // expect: var
IO.print(c) // expect: var
+18 -18
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.print(true == true) // expect: true
IO.print(true == false) // expect: false
IO.print(false == true) // expect: false
IO.print(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.print(true == 1) // expect: false
IO.print(false == 0) // expect: false
IO.print(true == "true") // expect: false
IO.print(false == "false") // expect: false
IO.print(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.print(true != true) // expect: false
IO.print(true != false) // expect: true
IO.print(false != true) // expect: true
IO.print(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.print(true != 1) // expect: true
IO.print(false != 0) // expect: true
IO.print(true != "true") // expect: true
IO.print(false != "false") // expect: true
IO.print(false != "") // expect: true
+3 -3
View File
@@ -1,3 +1,3 @@
IO.write(!true) // expect: false
IO.write(!false) // expect: true
IO.write(!!true) // expect: true
IO.print(!true) // expect: false
IO.print(!false) // expect: true
IO.print(!!true) // expect: true
+2 -2
View File
@@ -1,2 +1,2 @@
IO.write(true.toString) // expect: true
IO.write(false.toString) // expect: false
IO.print(true.toString) // expect: true
IO.print(false.toString) // expect: false
+4 -4
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.print(true is Bool) // expect: true
IO.print(true is Object) // expect: true
IO.print(true is Num) // expect: false
IO.print(true.type == Bool) // expect: true
+2 -2
View File
@@ -1,7 +1,7 @@
for (i in [1, 2, 3, 4, 5]) {
IO.write(i)
IO.print(i)
if (i > 2) break
IO.write(i)
IO.print(i)
}
// expect: 1
// expect: 1
+2 -2
View File
@@ -1,9 +1,9 @@
var i = 0
while (true) {
i = i + 1
IO.write(i)
IO.print(i)
if (i > 2) break
IO.write(i)
IO.print(i)
}
// expect: 1
// expect: 1
+2 -2
View File
@@ -1,11 +1,11 @@
var i = 0
while (true) {
IO.write("outer " + i.toString)
IO.print("outer " + i.toString)
if (i > 1) break
var j = 0
while (true) {
IO.write("inner " + j.toString)
IO.print("inner " + j.toString)
if (j > 1) break
j = j + 1
+8 -8
View File
@@ -1,13 +1,13 @@
IO.write(Num == Num) // expect: true
IO.write(Num == Bool) // expect: false
IO.print(Num == Num) // expect: true
IO.print(Num == Bool) // expect: false
// Not equal to other types.
IO.write(Num == 123) // expect: false
IO.write(Num == true) // expect: false
IO.print(Num == 123) // expect: false
IO.print(Num == true) // expect: false
IO.write(Num != Num) // expect: false
IO.write(Num != Bool) // expect: true
IO.print(Num != Num) // expect: false
IO.print(Num != Bool) // expect: true
// Not equal to other types.
IO.write(Num != 123) // expect: true
IO.write(Num != true) // expect: true
IO.print(Num != 123) // expect: true
IO.print(Num != true) // expect: true
+2 -2
View File
@@ -1,10 +1,10 @@
class Foo {
static sayName {
IO.write(Foo.toString)
IO.print(Foo.toString)
}
sayName {
IO.write(Foo.toString)
IO.print(Foo.toString)
}
static toString { return "Foo!" }
+1 -1
View File
@@ -1,6 +1,6 @@
class Foo {}
var foo = new Foo
IO.write(foo is Foo) // expect: true
IO.print(foo is Foo) // expect: true
// TODO: Test precedence and grammar of what follows "new".
+3 -3
View File
@@ -1,10 +1,10 @@
class Foo {}
// A class is a class.
IO.write(Foo is Class) // expect: true
IO.print(Foo is Class) // expect: true
// It's metatype is also a class.
IO.write(Foo.type is Class) // expect: true
IO.print(Foo.type is Class) // expect: true
// The metatype's metatype is Class.
IO.write(Foo.type.type == Class) // expect: true
IO.print(Foo.type.type == Class) // expect: true
+4 -4
View File
@@ -4,15 +4,15 @@ var g = null
{
var local = "local"
f = fn {
IO.write(local)
IO.print(local)
local = "after f"
IO.write(local)
IO.print(local)
}
g = fn {
IO.write(local)
IO.print(local)
local = "after g"
IO.write(local)
IO.print(local)
}
}
@@ -2,7 +2,7 @@ var f = null
fn(param) {
f = fn {
IO.write(param)
IO.print(param)
}
}.call("param")
@@ -3,7 +3,7 @@ var f = null
class Foo {
method(param) {
f = fn {
IO.write(param)
IO.print(param)
}
}
}
+1 -1
View File
@@ -3,7 +3,7 @@ var f = null
{
var local = "local"
f = fn {
IO.write(local)
IO.print(local)
}
}
+1 -1
View File
@@ -4,7 +4,7 @@ var foo = null
var local = "local"
class Foo {
method {
IO.write(local)
IO.print(local)
}
}
+3 -3
View File
@@ -7,9 +7,9 @@ fn {
fn {
var c = "c"
f = fn {
IO.write(a)
IO.write(b)
IO.write(c)
IO.print(a)
IO.print(b)
IO.print(c)
}
}.call
}.call
+1 -1
View File
@@ -1,6 +1,6 @@
{
var local = "local"
fn {
IO.write(local) // expect: local
IO.print(local) // expect: local
}.call
}
+1 -1
View File
@@ -2,7 +2,7 @@
var local = "local"
class Foo {
method {
IO.write(local)
IO.print(local)
}
}
@@ -3,8 +3,8 @@ var f = null
{
var a = "a"
f = fn {
IO.write(a)
IO.write(a)
IO.print(a)
IO.print(a)
}
}
+1 -1
View File
@@ -3,7 +3,7 @@
{
var a = "a"
f = fn IO.write(a)
f = fn IO.print(a)
}
{
+1 -1
View File
@@ -2,5 +2,5 @@ var global = "global"
// TODO: Forward reference to global declared after use.
fn {
IO.write(global) // expect: global
IO.print(global) // expect: global
}.call
+2 -2
View File
@@ -3,11 +3,11 @@ var global = "global"
class Foo {
method {
IO.write(global)
IO.print(global)
}
static classMethod {
IO.write(global)
IO.print(global)
}
}
+2 -2
View File
@@ -1,5 +1,5 @@
// In middle of line.
IO.write/* ... */(/* */"ok"/* */) // expect: ok
IO.print/* ... */(/* */"ok"/* */) // expect: ok
// Nested.
IO.write(/* in /* nest */ out */"ok") // expect: ok
IO.print(/* in /* nest */ out */"ok") // expect: ok
+1 -1
View File
@@ -1,2 +1,2 @@
IO.write("ok") // expect: ok
IO.print("ok") // expect: ok
/* comment */
+1 -1
View File
@@ -1,2 +1,2 @@
IO.write("ok") // expect: ok
IO.print("ok") // expect: ok
// comment
+1 -1
View File
@@ -8,4 +8,4 @@
// TODO: What about combining characters?
IO.write("ok") // expect: ok
IO.print("ok") // expect: ok
+1 -1
View File
@@ -1,3 +1,3 @@
// expect error line 3
IO.write("nope") /*
IO.print("nope") /*
oops
+1 -1
View File
@@ -1,4 +1,4 @@
// expect error line 4
IO.write("nope") /* /* /*
IO.print("nope") /* /* /*
*/
oops
+2 -2
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.print(foo is Foo) // expect: true
IO.print(foo.toString) // expect: Foo
+1 -1
View File
@@ -2,6 +2,6 @@ class Foo {
+ other { return "Foo " + other }
}
IO.write(new Foo + "value") // expect: Foo value
IO.print(new Foo + "value") // expect: Foo value
// TODO: Other expressions following a constructor, like new Foo.bar("arg").
+5 -5
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.print("zero") }
new(a) { IO.print(a) }
new(a, b) { IO.print(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.print(foo is Foo) // expect: true
IO.print(foo.toString) // expect: Foo
+9 -9
View File
@@ -1,6 +1,6 @@
class A {
new(arg) {
IO.write("new A " + arg)
IO.print("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.print("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.print("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.print(c is A) // expect: true
IO.print(c is B) // expect: true
IO.print(c is C) // expect: true
IO.write(c.aField) // expect: two
IO.write(c.bField) // expect: one
IO.write(c.cField) // expect: c
IO.print(c.aField) // expect: two
IO.print(c.bField) // expect: one
IO.print(c.cField) // expect: c
+1 -1
View File
@@ -4,4 +4,4 @@
if (true) {}
if (false) {} else {}
IO.write("ok") // expect: ok
IO.print("ok") // expect: ok
+2 -2
View File
@@ -11,6 +11,6 @@ class Foo {
}
var foo = new Foo
IO.write(foo.closeOverGet.call) // expect: Foo field
IO.print(foo.closeOverGet.call) // expect: Foo field
foo.closeOverSet.call
IO.write(foo.closeOverGet.call) // expect: new value
IO.print(foo.closeOverGet.call) // expect: new value
+1 -1
View File
@@ -1,5 +1,5 @@
class Foo {
write { IO.write(_field) }
write { IO.print(_field) }
}
(new Foo).write // expect: null
+5 -5
View File
@@ -8,11 +8,11 @@ class Foo {
}
write {
IO.write(_a)
IO.write(_b)
IO.write(_c)
IO.write(_d)
IO.write(_e)
IO.print(_a)
IO.print(_b)
IO.print(_c)
IO.print(_d)
IO.print(_e)
}
}
+3 -3
View File
@@ -1,17 +1,17 @@
class Outer {
method {
_field = "outer"
IO.write(_field) // expect: outer
IO.print(_field) // expect: outer
class Inner {
method {
_field = "inner"
IO.write(_field) // expect: inner
IO.print(_field) // expect: inner
}
}
(new Inner).method
IO.write(_field) // expect: outer
IO.print(_field) // expect: outer
}
}
+1 -1
View File
@@ -11,7 +11,7 @@ class Node {
_left.write
}
IO.write(_value)
IO.print(_value)
if (_right is Node) {
_right.write
+1 -1
View File
@@ -1,5 +1,5 @@
class Foo {
write { IO.write(_field) } // Compile a use of the field...
write { IO.print(_field) } // Compile a use of the field...
init { _field = "value" } // ...before an assignment to it.
}
+3 -3
View File
@@ -1,12 +1,12 @@
// Single-expression body.
for (i in [1, 2, 3]) IO.write(i)
for (i in [1, 2, 3]) IO.print(i)
// expect: 1
// expect: 2
// expect: 3
// Block body.
for (i in [1, 2, 3]) {
IO.write(i)
IO.print(i)
}
// expect: 1
// expect: 2
@@ -14,7 +14,7 @@ for (i in [1, 2, 3]) {
// Newline after "for".
for
(i in [1, 2, 3]) IO.write(i)
(i in [1, 2, 3]) IO.print(i)
// expect: 1
// expect: 2
// expect: 3
+2 -2
View File
@@ -1,8 +1,8 @@
var list = []
for (i in [1, 2, 3]) {
list.add(fn IO.write(i))
//list.add(fn IO.write(i))
list.add(fn IO.print(i))
//list.add(fn IO.print(i))
}
for (f in list) f.call
+1 -1
View File
@@ -2,7 +2,7 @@ var list = []
for (i in [1, 2, 3]) {
var j = i + 1
list.add(fn IO.write(j))
list.add(fn IO.print(j))
}
for (f in list) f.call
+3 -3
View File
@@ -1,12 +1,12 @@
// Single-expression body.
for (i in [1, 2, 3]) IO.write(i)
for (i in [1, 2, 3]) IO.print(i)
// expect: 1
// expect: 2
// expect: 3
// Block body.
for (i in [1, 2, 3]) {
IO.write(i)
IO.print(i)
}
// expect: 1
// expect: 2
@@ -14,7 +14,7 @@ for (i in [1, 2, 3]) {
// Newline after "for".
for
(i in [1, 2, 3]) IO.write(i)
(i in [1, 2, 3]) IO.print(i)
// expect: 1
// expect: 2
// expect: 3
+2 -2
View File
@@ -1,9 +1,9 @@
var f = fn {
IO.write("evaluate sequence")
IO.print("evaluate sequence")
return [1, 2, 3]
}
for (i in f.call) IO.write(i)
for (i in f.call) IO.print(i)
// expect: evaluate sequence
// expect: 1
// expect: 2
+1 -1
View File
@@ -1,2 +1,2 @@
var f = fn {}
IO.write(f.call) // expect: null
IO.print(f.call) // expect: null
+10 -10
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.print((fn 123) == (fn 123)) // expect: false
IO.print((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.print((fn 123) == 1) // expect: false
IO.print((fn 123) == false) // expect: false
IO.print((fn 123) == "fn 123") // expect: false
IO.print((fn 123) != 1) // expect: true
IO.print((fn 123) != false) // expect: true
IO.print((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.print(f == f) // expect: true
IO.print(f != f) // expect: false
+17 -17
View File
@@ -1,50 +1,50 @@
var f0 = fn 0
IO.write(f0.call) // expect: 0
IO.print(f0.call) // expect: 0
var f1 = fn(a) a
IO.write(f1.call(1)) // expect: 1
IO.print(f1.call(1)) // expect: 1
var f2 = fn(a, b) a + b
IO.write(f2.call(1, 2)) // expect: 3
IO.print(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.print(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.print(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.print(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.print(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.print(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.print(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.print(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.print(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.print(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.print(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.print(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.print(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.print(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.print(f16.call(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)) // expect: 136
+7 -7
View File
@@ -1,31 +1,31 @@
// Single expression body.
(fn IO.write("ok")).call // expect: ok
(fn IO.print("ok")).call // expect: ok
// TODO: Precedence of fn body.
// Curly body.
fn {
IO.write("ok") // expect: ok
IO.print("ok") // expect: ok
}.call
// No trailing newline.
fn {
IO.write("ok") }.call // expect: ok
IO.print("ok") }.call // expect: ok
// Multiple expressions.
fn {
IO.write("1") // expect: 1
IO.write("2") // expect: 2
IO.print("1") // expect: 1
IO.print("2") // expect: 2
}.call
// Extra newlines.
fn {
IO.write("1") // expect: 1
IO.print("1") // expect: 1
IO.write("2") // expect: 2
IO.print("2") // expect: 2
}.call
+4 -4
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.print((fn 0) is Function) // expect: true
IO.print((fn 0) is Object) // expect: true
IO.print((fn 0) is String) // expect: false
IO.print((fn 0).type == Function) // expect: true
+10 -10
View File
@@ -1,31 +1,31 @@
// * has higher precedence than +.
IO.write(2 + 3 * 4) // expect: 14
IO.print(2 + 3 * 4) // expect: 14
// * has higher precedence than -.
IO.write(20 - 3 * 4) // expect: 8
IO.print(20 - 3 * 4) // expect: 8
// / has higher precedence than +.
IO.write(2 + 6 / 3) // expect: 4
IO.print(2 + 6 / 3) // expect: 4
// / has higher precedence than -.
IO.write(2 - 6 / 3) // expect: 0
IO.print(2 - 6 / 3) // expect: 0
// < has higher precedence than ==.
IO.write(false == 2 < 1) // expect: true
IO.print(false == 2 < 1) // expect: true
// > has higher precedence than ==.
IO.write(false == 1 > 2) // expect: true
IO.print(false == 1 > 2) // expect: true
// <= has higher precedence than ==.
IO.write(false == 2 <= 1) // expect: true
IO.print(false == 2 <= 1) // expect: true
// >= has higher precedence than ==.
IO.write(false == 1 >= 2) // expect: true
IO.print(false == 1 >= 2) // expect: true
// Unary - has lower precedence than ..
IO.write(-"abc".count) // expect: -3
IO.print(-"abc".count) // expect: -3
// TODO: %, associativity.
// Using () for grouping.
IO.write((2 * (6 - (2 + 2)))) // expect: 4
IO.print((2 * (6 - (2 + 2)))) // expect: 4
+13 -13
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.print("good") // expect: good
if (false) IO.print("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.print("good") else IO.print("bad") // expect: good
if (false) IO.print("bad") else IO.print("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.print("block") } // expect: block
if (false) null else { IO.print("block") } // expect: block
// Assignment in if condition.
var a = false
if (a = true) IO.write(a) // expect: true
if (a = true) IO.print(a) // expect: true
// Newline after "if".
if
(true) IO.write("good") // expect: good
(true) IO.print("good") // expect: good
// Newline after "else".
if (false) IO.write("bad") else
IO.write("good") // expect: good
if (false) IO.print("bad") else
IO.print("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.print(0) // expect: 0
if (null) IO.print(null) // expect: null
if ("") IO.print("empty") // expect: empty
+4 -4
View File
@@ -5,8 +5,8 @@ class Foo {
}
fooPrint {
IO.write(_field1)
IO.write(_field2)
IO.print(_field1)
IO.print(_field2)
}
}
@@ -17,8 +17,8 @@ class Bar is Foo {
}
barPrint {
IO.write(_field1)
IO.write(_field2)
IO.print(_field1)
IO.print(_field2)
}
}
+8 -8
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.print("foo") }
method(a) { IO.print("foo") }
method(a, b, c) { IO.print("foo") }
override { IO.print("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.print("bar") }
method(a, b) { IO.print("bar") }
method(a, b, c, d) { IO.print("bar") }
override { IO.print("bar") }
}
var bar = new Bar
+8 -8
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.print("foo") }
static method(a) { IO.print("foo") }
static method(a, b, c) { IO.print("foo") }
static override { IO.print("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.print("bar") }
static method(a, b) { IO.print("bar") }
static method(a, b, c, d) { IO.print("bar") }
static override { IO.print("bar") }
}
Bar.methodOnFoo // expect: foo
+9 -9
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.print(a is A) // expect: true
IO.print(a is B) // expect: false
IO.print(a is C) // expect: false
IO.print(b is A) // expect: true
IO.print(b is B) // expect: true
IO.print(b is C) // expect: false
IO.print(c is A) // expect: true
IO.print(c is B) // expect: true
IO.print(c is C) // expect: true
+3 -3
View File
@@ -3,10 +3,10 @@ class Foo {
}
// Calls toString on argument.
IO.write(new Foo) // expect: Foo.toString
IO.print(new Foo) // expect: Foo.toString
// Returns argument.
var result = IO.write(123) // expect: 123
IO.write(result == 123) // expect: true
var result = IO.print(123) // expect: 123
IO.print(result == 123) // expect: true
// TODO: What if toString on argument doesn't return a string?
+24 -24
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.print(Num is Class) // expect: true
IO.print(true is Bool) // expect: true
IO.print((fn 1) is Function) // expect: true
IO.print(123 is Num) // expect: true
IO.print(null is Null) // expect: true
IO.print("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.print(Num is Bool) // expect: false
IO.print(null is Class) // expect: false
IO.print(true is Function) // expect: false
IO.print((fn 1) is Num) // expect: false
IO.print("s" is Null) // expect: false
IO.print(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.print(Num is Object) // expect: true
IO.print(null is Object) // expect: true
IO.print(true is Object) // expect: true
IO.print((fn 1) is Object) // expect: true
IO.print("s" is Object) // expect: true
IO.print(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.print(Num is Class) // expect: true
IO.print(null is Class) // expect: false
IO.print(true is Class) // expect: false
IO.print((fn 1) is Class) // expect: false
IO.print("s" is Class) // expect: false
IO.print(123 is Class) // expect: false
// TODO: Non-class on RHS.
// TODO: Precedence and associativity.
+1000 -1000
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,6 +1,6 @@
// Create a very long string containing escape sequences.
var s = "1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\n1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\n1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\n1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\n1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\n1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\n1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\n1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\n1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\n1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890\"1234567890"
IO.write(s)
IO.print(s)
// expect: 1234567890"1234567890"1234567890"1234567890"1234567890"1234567890"1234567890"1234567890"1234567890"1234567890
// expect: 1234567890"1234567890"1234567890"1234567890"1234567890"1234567890"1234567890"1234567890"1234567890"1234567890
// expect: 1234567890"1234567890"1234567890"1234567890"1234567890"1234567890"1234567890"1234567890"1234567890"1234567890
+1 -1
View File
@@ -8191,7 +8191,7 @@ var f = fn {
65513; 65514; 65515; 65516; 65517; 65518; 65519; 65520;
65521; 65522; 65523; 65524; 65525; 65526; 65527; 65528;
65529; 65530; 65531; 65532; 65533; 65534; 65535;
IO.write(65536)
IO.print(65536)
}
f.call // expect: 65536
+4 -4
View File
@@ -1,10 +1,10 @@
var a = []
a.add(1)
IO.write(a) // expect: [1]
IO.print(a) // expect: [1]
a.add(2)
IO.write(a) // expect: [1, 2]
IO.print(a) // expect: [1, 2]
a.add(3)
IO.write(a) // expect: [1, 2, 3]
IO.print(a) // expect: [1, 2, 3]
// Returns added element.
IO.write(a.add(4)) // expect: 4
IO.print(a.add(4)) // expect: 4
+3 -3
View File
@@ -1,7 +1,7 @@
var a = [1, 2, 3]
a.clear
IO.write(a) // expect: []
IO.write(a.count) // expect: 0
IO.print(a) // expect: []
IO.print(a.count) // expect: 0
// Returns null.
IO.write([1, 2].clear) // expect: null
IO.print([1, 2].clear) // expect: null
+3 -3
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.print([].count) // expect: 0
IO.print([1].count) // expect: 1
IO.print([1, 2, 3, 4].count) // expect: 4
+10 -10
View File
@@ -1,41 +1,41 @@
// Add to empty list.
var a = []
a.insert(1, 0)
IO.write(a) // expect: [1]
IO.print(a) // expect: [1]
// Normal indices.
var b = [1, 2, 3]
b.insert(4, 0)
IO.write(b) // expect: [4, 1, 2, 3]
IO.print(b) // expect: [4, 1, 2, 3]
var c = [1, 2, 3]
c.insert(4, 1)
IO.write(c) // expect: [1, 4, 2, 3]
IO.print(c) // expect: [1, 4, 2, 3]
var d = [1, 2, 3]
d.insert(4, 2)
IO.write(d) // expect: [1, 2, 4, 3]
IO.print(d) // expect: [1, 2, 4, 3]
var e = [1, 2, 3]
e.insert(4, 3)
IO.write(e) // expect: [1, 2, 3, 4]
IO.print(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.print(f) // expect: [4, 1, 2, 3]
var g = [1, 2, 3]
g.insert(4, -3)
IO.write(g) // expect: [1, 4, 2, 3]
IO.print(g) // expect: [1, 4, 2, 3]
var h = [1, 2, 3]
h.insert(4, -2)
IO.write(h) // expect: [1, 2, 4, 3]
IO.print(h) // expect: [1, 2, 4, 3]
var i = [1, 2, 3]
i.insert(4, -1)
IO.write(i) // expect: [1, 2, 3, 4]
IO.print(i) // expect: [1, 2, 3, 4]
// Returns.inserted value.
IO.write([1, 2].insert(3, 0)) // expect: 3
IO.print([1, 2].insert(3, 0)) // expect: 3
+6 -6
View File
@@ -1,7 +1,7 @@
var a = ["one", "two", "three", "four"]
IO.write(a.iterate(null)) // expect: 0
IO.write(a.iterate(0)) // expect: 1
IO.write(a.iterate(1)) // expect: 2
IO.write(a.iterate(2)) // expect: 3
IO.write(a.iterate(3)) // expect: false
IO.write(a.iterate(-1)) // expect: false
IO.print(a.iterate(null)) // expect: 0
IO.print(a.iterate(0)) // expect: 1
IO.print(a.iterate(1)) // expect: 2
IO.print(a.iterate(2)) // expect: 3
IO.print(a.iterate(3)) // expect: false
IO.print(a.iterate(-1)) // expect: false
+4 -4
View File
@@ -1,5 +1,5 @@
var a = ["one", "two", "three", "four"]
IO.write(a.iteratorValue(0)) // expect: one
IO.write(a.iteratorValue(1)) // expect: two
IO.write(a.iteratorValue(2)) // expect: three
IO.write(a.iteratorValue(3)) // expect: four
IO.print(a.iteratorValue(0)) // expect: one
IO.print(a.iteratorValue(1)) // expect: two
IO.print(a.iteratorValue(2)) // expect: three
IO.print(a.iteratorValue(3)) // expect: four
+4 -4
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.print(list[0]) // expect: a
IO.print(list[1]) // expect: b
IO.print(list[2]) // expect: c
IO.print(list[3]) // expect: d
+7 -7
View File
@@ -1,27 +1,27 @@
var a = [1, 2, 3]
a.removeAt(0)
IO.write(a) // expect: [2, 3]
IO.print(a) // expect: [2, 3]
var b = [1, 2, 3]
b.removeAt(1)
IO.write(b) // expect: [1, 3]
IO.print(b) // expect: [1, 3]
var c = [1, 2, 3]
c.removeAt(2)
IO.write(c) // expect: [1, 2]
IO.print(c) // expect: [1, 2]
// Index backwards from end.
var d = [1, 2, 3]
d.removeAt(-3)
IO.write(d) // expect: [2, 3]
IO.print(d) // expect: [2, 3]
var e = [1, 2, 3]
e.removeAt(-2)
IO.write(e) // expect: [1, 3]
IO.print(e) // expect: [1, 3]
var f = [1, 2, 3]
f.removeAt(-1)
IO.write(f) // expect: [1, 2]
IO.print(f) // expect: [1, 2]
// Return the removed value.
IO.write([3, 4, 5].removeAt(1)) // expect: 4
IO.print([3, 4, 5].removeAt(1)) // expect: 4
+8 -8
View File
@@ -1,12 +1,12 @@
// 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.print(list[0]) // expect: a
IO.print(list[1]) // expect: b
IO.print(list[2]) // expect: c
IO.print(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.print(list[-4]) // expect: a
IO.print(list[-3]) // expect: b
IO.print(list[-2]) // expect: c
IO.print(list[-1]) // expect: d
+3 -3
View File
@@ -4,13 +4,13 @@
list[0] = 5
list[1] = 6
list[2] = 7
IO.write(list) // expect: [5, 6, 7]
IO.print(list) // expect: [5, 6, 7]
}
// Returns right-hand side.
{
var list = [1, 2, 3]
IO.write(list[1] = 5) // expect: 5
IO.print(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.print(list) // expect: [7, 6, 5]
}
// TODO: Handle out of range.
+4 -4
View File
@@ -1,17 +1,17 @@
// Handle empty list.
IO.write([].toString) // expect: []
IO.print([].toString) // expect: []
// Does not quote strings.
IO.write([1, "2", true].toString) // expect: [1, 2, true]
IO.print([1, "2", true].toString) // expect: [1, 2, true]
// Nested lists.
IO.write([1, [2, [3], 4], 5]) // expect: [1, [2, [3], 4], 5]
IO.print([1, [2, [3], 4], 5]) // expect: [1, [2, [3], 4], 5]
// Calls toString on elements.
class Foo {
toString { return "Foo.toString" }
}
IO.write([1, new Foo, 2]) // expect: [1, Foo.toString, 2]
IO.print([1, new Foo, 2]) // expect: [1, Foo.toString, 2]
// TODO: Handle lists that contain themselves.
+4 -4
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.print([] is List) // expect: true
IO.print([] is Object) // expect: true
IO.print([] is Bool) // expect: false
IO.print([].type == List) // expect: true
+17 -17
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.print(foo.method) // expect: 0
IO.print(foo.method(1)) // expect: 1
IO.print(foo.method(1, 2)) // expect: 3
IO.print(foo.method(1, 2, 3)) // expect: 6
IO.print(foo.method(1, 2, 3, 4)) // expect: 10
IO.print(foo.method(1, 2, 3, 4, 5)) // expect: 15
IO.print(foo.method(1, 2, 3, 4, 5, 6)) // expect: 21
IO.print(foo.method(1, 2, 3, 4, 5, 6, 7)) // expect: 28
IO.print(foo.method(1, 2, 3, 4, 5, 6, 7, 8)) // expect: 36
IO.print(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9)) // expect: 45
IO.print(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) // expect: 55
IO.print(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)) // expect: 66
IO.print(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)) // expect: 78
IO.print(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)) // expect: 91
IO.print(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)) // expect: 105
IO.print(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)) // expect: 120
IO.print(foo.method(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)) // expect: 136
+1 -1
View File
@@ -2,4 +2,4 @@ class Foo {
bar {}
}
IO.write((new Foo).bar) // expect: null
IO.print((new Foo).bar) // expect: null
+1 -1
View File
@@ -4,4 +4,4 @@ class Foo {
}
}
IO.write((new Foo).thisHasAMethodNameThatIsExactly64CharactersLongWhichIsTheMaximum) // expect: result
IO.print((new Foo).thisHasAMethodNameThatIsExactly64CharactersLongWhichIsTheMaximum) // expect: result
+1 -1
View File
@@ -2021,4 +2021,4 @@ result = result + foo.method996
result = result + foo.method997
result = result + foo.method998
result = result + foo.method999
IO.write(result) // expect: 1000
IO.print(result) // expect: 1000
+13 -13
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.print(foo + "a") // expect: infix + a
IO.print(foo - "a") // expect: infix - a
IO.print(foo * "a") // expect: infix * a
IO.print(foo / "a") // expect: infix / a
IO.print(foo % "a") // expect: infix % a
IO.print(foo < "a") // expect: infix < a
IO.print(foo > "a") // expect: infix > a
IO.print(foo <= "a") // expect: infix <= a
IO.print(foo >= "a") // expect: infix >= a
IO.print(foo == "a") // expect: infix == a
IO.print(foo != "a") // expect: infix != a
IO.print(!foo) // expect: prefix !
IO.print(-foo) // expect: prefix -
+4 -4
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.print((new Foo).bar) // expect: on instance
IO.print(Foo.bar) // expect: on metaclass
IO.print((new Foo).bar("arg")) // expect: on instance arg
IO.print(Foo.bar("arg")) // expect: on metaclass arg
+1 -1
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.print(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17) // expect error
+1 -1
View File
@@ -1 +1 @@
IO.write("ok") // expect: ok
IO.print("ok") // expect: ok
+1 -1
View File
@@ -1 +1 @@
IO.write(null) // expect: null
IO.print(null) // expect: null
+4 -4
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.print(null is Null) // expect: true
IO.print(null is Object) // expect: true
IO.print(null is Bool) // expect: false
IO.print(null.type == Null) // expect: true
+6 -6
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.print(123.abs) // expect: 123
IO.print(-123.abs) // expect: 123
IO.print(0.abs) // expect: 0
IO.print(-0.abs) // expect: 0
IO.print(-0.12.abs) // expect: 0.12
IO.print(12.34.abs) // expect: 12.34
+14 -14
View File
@@ -1,22 +1,22 @@
IO.write(~0) // expect: 4294967295
IO.write(~1) // expect: 4294967294
IO.write(~23) // expect: 4294967272
IO.print(~0) // expect: 4294967295
IO.print(~1) // expect: 4294967294
IO.print(~23) // expect: 4294967272
// Max u32 value.
IO.write(~4294967295) // expect: 0
IO.print(~4294967295) // expect: 0
// Past max u32 value.
IO.write(~4294967296) // expect: 4294967295
IO.print(~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.print(~-1) // expect: 0
IO.print(~-123) // expect: 122
IO.print(~-4294967294) // expect: 4294967293
IO.print(~-4294967295) // expect: 4294967294
IO.print(~-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.print(~1.23) // expect: 4294967294
IO.print(~0.00123) // expect: 4294967295
IO.print(~345.67) // expect: 4294966950
IO.print(~-12.34) // expect: 11
+20 -20
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.print(1 < 2) // expect: true
IO.print(2 < 2) // expect: false
IO.print(2 < 1) // expect: false
IO.write(1 <= 2) // expect: true
IO.write(2 <= 2) // expect: true
IO.write(2 <= 1) // expect: false
IO.print(1 <= 2) // expect: true
IO.print(2 <= 2) // expect: true
IO.print(2 <= 1) // expect: false
IO.write(1 > 2) // expect: false
IO.write(2 > 2) // expect: false
IO.write(2 > 1) // expect: true
IO.print(1 > 2) // expect: false
IO.print(2 > 2) // expect: false
IO.print(2 > 1) // expect: true
IO.write(1 >= 2) // expect: false
IO.write(2 >= 2) // expect: true
IO.write(2 >= 1) // expect: true
IO.print(1 >= 2) // expect: false
IO.print(2 >= 2) // expect: true
IO.print(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.print(0 < -0) // expect: false
IO.print(-0 < 0) // expect: false
IO.print(0 > -0) // expect: false
IO.print(-0 > 0) // expect: false
IO.print(0 <= -0) // expect: true
IO.print(-0 <= 0) // expect: true
IO.print(0 >= -0) // expect: true
IO.print(-0 >= 0) // expect: true
// TODO: Wrong type for RHS.
+2 -2
View File
@@ -1,5 +1,5 @@
IO.write(8 / 2) // expect: 4
IO.write(12.34 / -0.4) // expect: -30.85
IO.print(8 / 2) // expect: 4
IO.print(12.34 / -0.4) // expect: -30.85
// TODO: Unsupported RHS types.
// TODO: Divide by zero.
+14 -14
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.print(123 == 123) // expect: true
IO.print(123 == 124) // expect: false
IO.print(-3 == 3) // expect: false
IO.print(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.print(123 == "123") // expect: false
IO.print(1 == true) // expect: false
IO.print(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.print(123 != 123) // expect: false
IO.print(123 != 124) // expect: true
IO.print(-3 != 3) // expect: true
IO.print(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.print(123 != "123") // expect: true
IO.print(1 != true) // expect: true
IO.print(0 != false) // expect: true
+6 -6
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.print(123) // expect: 123
IO.print(987654) // expect: 987654
IO.print(0) // expect: 0
IO.print(-0) // expect: -0
IO.write(123.456) // expect: 123.456
IO.write(-0.001) // expect: -0.001
IO.print(123.456) // expect: 123.456
IO.print(-0.001) // expect: -0.001
// TODO: Hex? Scientific notation?
// TODO: Literals at and beyond numeric limits.
+4 -4
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.print(5 - 3) // expect: 2
IO.print(3.1 - 0.24) // expect: 2.86
IO.print(3 - 2 - 1) // expect: 0
// Unary negation.
var a = 3
IO.write(-a) // expect: -3
IO.print(-a) // expect: -3
// TODO: Unsupported RHS types.
+9 -9
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.print(5 % 3) // expect: 2
IO.print(10 % 5) // expect: 0
IO.print(-4 % 3) // expect: -1
IO.print(4 % -3) // expect: 1
IO.print(-4 % -3) // expect: -1
IO.print(-4.2 % 3.1) // expect: -1.1
IO.print(4.2 % -3.1) // expect: 1.1
IO.print(-4.2 % -3.1) // expect: -1.1
// Left associative.
IO.write(13 % 7 % 4) // expect: 2
IO.print(13 % 7 % 4) // expect: 2
// TODO: Unsupported RHS types.
// TODO: Error on mod by zero.
+2 -2
View File
@@ -1,4 +1,4 @@
IO.write(5 * 3) // expect: 15
IO.write(12.34 * 0.3) // expect: 3.702
IO.print(5 * 3) // expect: 15
IO.print(12.34 * 0.3) // expect: 3.702
// TODO: Unsupported RHS types.
+3 -3
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.print(1 + 2) // expect: 3
IO.print(12.34 + 0.13) // expect: 12.47
IO.print(3 + 5 + 2) // expect: 10
// TODO: Unsupported RHS types.
+6 -6
View File
@@ -1,12 +1,12 @@
var inclusive = 2..5
IO.write(inclusive is Range) // expect: true
IO.write(inclusive.min) // expect: 2
IO.write(inclusive.max) // expect: 5
IO.print(inclusive is Range) // expect: true
IO.print(inclusive.min) // expect: 2
IO.print(inclusive.max) // expect: 5
var exclusive = 2...5
IO.write(exclusive is Range) // expect: true
IO.write(exclusive.min) // expect: 2
IO.write(exclusive.max) // expect: 4
IO.print(exclusive is Range) // expect: true
IO.print(exclusive.min) // expect: 2
IO.print(exclusive.max) // expect: 4
// TODO: Non-number RHS.
// TODO: Non-integer RHS.
+5 -5
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.print(123.toString == "123") // expect: true
IO.print(-123.toString == "-123") // expect: true
IO.print(-0.toString == "-0") // expect: true
IO.print(12.34.toString == "12.34") // expect: true
IO.print(-0.0001.toString == "-0.0001") // expect: true

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