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
+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