E11068: string concatenation with 3+ parts - use string interpolation instead
What went wrong
A string concatenation chain with 3 or more parts was detected. EK9 provides string interpolation (backtick syntax) which is both more readable and more efficient than concatenation with the + operator.
Worked examples
Compilable examples demonstrating this error and the correct fix:
- ek9 -q 309 (Why does string concatenation with + cause a compiler err...)
- ek9 -q 174 (How do I join or concatenate strings in EK9?)
- ek9 -q 313 (How does EK9 detect code smells?)
Rationale
Each + operator on strings calls the pure _add method, creating a new intermediate String object. A chain of N concatenations creates N-1 temporary objects. String interpolation compiles to a single bespoke STRING_INTERPOLATION IR instruction that backends optimise to one allocation:
JVM: invokedynamic StringConcatFactory.makeConcatWithConstants() LLVM: single allocation with pre-calculated length + memcpy
Beyond performance, interpolation is more readable. The template shows the output shape directly, while concatenation requires mentally assembling fragments separated by + operators.
For AI analysis, an interpolated string is one semantic unit. A concatenation chain is N tokens that must be mentally reconstructed into the intended output - expensive inference that interpolation eliminates.
How to fix it
Convert the concatenation chain to string interpolation: '"Hello " + name + "!"' (three parts, three allocations) becomes `Hello ${name}!` (one, with the output's shape visible), and '"(" + $x + ", " + $y + ")"' becomes `(${x}, ${y})`. A value inside ${...} is converted with its own '$' operator, so no '$' is needed there. The [EXAMPLE] section below shows chains of three, four and five parts, then the forms that are fine (an interpolation, a two-part join, a numeric sum).
See also
Examples
Every example is compiled by the EK9 compiler: the first fails exactly as captioned, the others fix it.
Fails with E11068: string concatenation with 3+ parts - use string interpolation instead
#!ek9 defines module error.e11068.bad defines function threePartChain() -> name as String <- result as String: String() result: "Hello " + name + "!" fourPartChain() -> first as String last as String <- result as String: String() result: first + " " + last + " here" fivePartChainWithDollar() -> x as Integer y as Integer <- result as String: String() result: "(" + $x + ", " + $y + ")"
Fixed: Interpolate: one backtick String in place of the chain
#!ek9 defines module error.e11068.good.fix defines function threePartChain() -> name as String <- result as String: String() result: `Hello ${name}!` fourPartChain() -> first as String last as String <- result as String: String() result: `${first} ${last} here` fivePartChainWithDollar() -> x as Integer y as Integer <- result as String: String() result: `(${x}, ${y})`
Fixed: Use string interpolation
#!ek9 defines module error.e11068.good defines function //Two-part concat is allowed (below threshold) twoPartConcat() -> name as String <- result as String: String() result: "Hello " + name //Interpolation is fine (obviously) interpolation() -> name as String <- result as String: `Hello ${name}!` //Numeric addition is fine (not String type) numericAddition() -> a as Integer b as Integer c as Integer <- result as Integer: 0 result: a + b + c //String concat as just two variables twoVariables() -> first as String last as String <- result as String: String() result: first + last
Questions and answers
These Q&A entries show E11068 and its fix:
- Q172: How do I convert a string to uppercase or lowercase in EK9?
- Q174: How do I join or concatenate strings in EK9?
- Q176: How do I pad a string to a fixed width in EK9?
- Q309: Why does string concatenation with + cause a compiler error in EK9?
- Q313: How does EK9 detect code smells?
- Q1164: Build a formatted string with embedded expressions using backtick interpolation.