feat: implement string interpolation with %(expr) syntax in compiler and core library

Add lexer support for `TOKEN_INTERPOLATION` to split string literals at interpolation points, introduce `MAX_INTERPOLATION_NESTING` limit of 8, and compile interpolated strings by emitting calls to `String.interpolate_()`. Optimize list and map literal construction with new `addCore_` primitives to reduce stack churn. Update `String`, `List`, and `Map` `toString` methods in core library to use interpolation syntax, and migrate all benchmark and test files from explicit concatenation to interpolated strings.
This commit is contained in:
Bob Nystrom
2015-11-11 15:55:48 +00:00
parent a8961f817e
commit 920b3e2a32
41 changed files with 321 additions and 129 deletions
+2
View File
@@ -0,0 +1,2 @@
// expect error line 3
" %() "
@@ -0,0 +1,15 @@
// Full string.
System.print("%(1 + 2)") // expect: 3
// Multiple in one string.
System.print("str%(1 + 2)(%(3 + 4)\%%(5 + 6)") // expect: str3(7%11
// Nested.
System.print("[%("{%("in" + "ner")}")]") // expect: [{inner}]
// Ignore newlines in template.
System.print("[%(
"template"
)]") // expect: [template]
@@ -0,0 +1 @@
System.print("%(123.badMethod)") // expect runtime error: Num does not implement 'badMethod'.
@@ -0,0 +1,8 @@
var fiber = Fiber.new {
System.print("in fiber")
Fiber.yield("result")
}
System.print("outer %(fiber.call()) string")
// expect: in fiber
// expect: outer result string
@@ -0,0 +1,2 @@
" %(
// expect error
@@ -0,0 +1,2 @@
// expect error line 2
" %(123"