diff --git a/library/src/scala/tasty/reflect/SourceCodePrinter.scala b/library/src/scala/tasty/reflect/SourceCodePrinter.scala index 655bd75b317e..75da3d55750b 100644 --- a/library/src/scala/tasty/reflect/SourceCodePrinter.scala +++ b/library/src/scala/tasty/reflect/SourceCodePrinter.scala @@ -324,7 +324,7 @@ class SourceCodePrinter[R <: Reflection & Singleton](val tasty: R)(syntaxHighlig case tree: Ident => splicedName(tree.symbol) match { - case Some(name) => this += name + case Some(name) => this += highlightTypeDef(name) case _ => printType(tree.tpe) } @@ -834,7 +834,7 @@ class SourceCodePrinter[R <: Reflection & Singleton](val tasty: R)(syntaxHighlig } def printParamDef(arg: ValDef)(using elideThis: Option[Symbol]): Unit = { - val name = arg.name + val name = splicedName(arg.symbol).getOrElse(arg.symbol.name) val sym = arg.symbol.owner if sym.isDefDef && sym.name == "" then val ClassDef(_, _, _, _, _, body) = sym.owner.tree @@ -1409,11 +1409,26 @@ class SourceCodePrinter[R <: Reflection & Singleton](val tasty: R)(syntaxHighlig private def escapedString(str: String): String = str flatMap escapedChar } + private[this] val names = collection.mutable.Map.empty[Symbol, String] + private[this] val namesIndex = collection.mutable.Map.empty[String, Int] + private def splicedName(sym: Symbol)(using ctx: Context): Option[String] = { sym.annots.find(_.symbol.owner == ctx.requiredClass("scala.internal.quoted.showName")).flatMap { case Apply(_, Literal(Constant(c: String)) :: Nil) => Some(c) case Apply(_, Inlined(_, _, Literal(Constant(c: String))) :: Nil) => Some(c) case annot => None + }.orElse { + if sym.owner.isClassDef then None + else names.get(sym).orElse { + val name0 = sym.name + val index = namesIndex.getOrElse(name0, 1) + namesIndex(name0) = index + 1 + val name = + if index == 1 then name0 + else s"`$name0${index.toString.toCharArray.map {x => (x - '0' + '₀').toChar}.mkString}`" + names(sym) = name + Some(name) + } } } diff --git a/tests/run-macros/flops-rewrite.check b/tests/run-macros/flops-rewrite.check index 1df685ef872f..cab785970d7c 100644 --- a/tests/run-macros/flops-rewrite.check +++ b/tests/run-macros/flops-rewrite.check @@ -1,7 +1,7 @@ scala.Nil.map[scala.Nothing](((x: scala.Nothing) => x)) scala.Nil -scala.Nil.map[scala.Nothing](((x: scala.Nothing) => x)).++[scala.Nothing](scala.Nil.map[scala.Nothing](((x: scala.Nothing) => x))) +scala.Nil.map[scala.Nothing](((x: scala.Nothing) => x)).++[scala.Nothing](scala.Nil.map[scala.Nothing](((`x₂`: scala.Nothing) => `x₂`))) scala.Nil scala.Nil.map[scala.Nothing](((x: scala.Nothing) => x)).++[scala.Int](scala.List.apply[scala.Int](3)).++[scala.Int](scala.Nil) diff --git a/tests/run-macros/quote-matching-optimize-1.check b/tests/run-macros/quote-matching-optimize-1.check index 383e8c426e8a..2c04c3f43f67 100644 --- a/tests/run-macros/quote-matching-optimize-1.check +++ b/tests/run-macros/quote-matching-optimize-1.check @@ -1,18 +1,18 @@ -Original: ls.filter(((x: scala.Int) => x.<(3))).filter(((x: scala.Int) => x.>(1))) +Original: ls.filter(((x: scala.Int) => x.<(3))).filter(((`x₂`: scala.Int) => `x₂`.>(1))) Optimized: ls.filter(((x: scala.Int) => x.<(3).&&(x.>(1)))) Result: List(2) -Original: ls2.filter(((x: scala.Char) => x.<('c'))).filter(((x: scala.Char) => x.>('a'))) +Original: ls2.filter(((x: scala.Char) => x.<('c'))).filter(((`x₂`: scala.Char) => `x₂`.>('a'))) Optimized: ls2.filter(((x: scala.Char) => x.<('c').&&(x.>('a')))) Result: List(b) -Original: ls.filter(((x: scala.Int) => x.<(3))).filter(((x: scala.Int) => x.>(1))).filter(((x: scala.Int) => x.==(2))) +Original: ls.filter(((x: scala.Int) => x.<(3))).filter(((`x₂`: scala.Int) => `x₂`.>(1))).filter(((`x₃`: scala.Int) => `x₃`.==(2))) Optimized: ls.filter(((x: scala.Int) => x.<(3).&&(x.>(1).&&(x.==(2))))) Result: List(2) 1 2 -Original: ls.filter(((x: scala.Int) => x.<(3))).foreach[scala.Unit](((x: scala.Int) => scala.Predef.println(x))) +Original: ls.filter(((x: scala.Int) => x.<(3))).foreach[scala.Unit](((`x₂`: scala.Int) => scala.Predef.println(`x₂`))) Optimized: ls.foreach[scala.Unit](((x: scala.Int) => if (x.<(3)) scala.Predef.println(x) else ())) Result: () diff --git a/tests/run-macros/quote-matching-optimize-2.check b/tests/run-macros/quote-matching-optimize-2.check index ae181d841a14..787765a77667 100644 --- a/tests/run-macros/quote-matching-optimize-2.check +++ b/tests/run-macros/quote-matching-optimize-2.check @@ -1,18 +1,18 @@ -Original: ls.filter(((x: scala.Int) => x.<(3))).filter(((x: scala.Int) => x.>(1))) +Original: ls.filter(((x: scala.Int) => x.<(3))).filter(((`x₂`: scala.Int) => `x₂`.>(1))) Optimized: ls.filter(((x: scala.Int) => x.<(3).&&(x.>(1)))) Result: List(2) -Original: ls2.filter(((x: scala.Char) => x.<('c'))).filter(((x: scala.Char) => x.>('a'))) +Original: ls2.filter(((x: scala.Char) => x.<('c'))).filter(((`x₂`: scala.Char) => `x₂`.>('a'))) Optimized: ls2.filter(((x: scala.Char) => x.<('c').&&(x.>('a')))) Result: List(b) -Original: ls.filter(((x: scala.Int) => x.<(3))).filter(((x: scala.Int) => x.>(1))).filter(((x: scala.Int) => x.==(2))) +Original: ls.filter(((x: scala.Int) => x.<(3))).filter(((`x₂`: scala.Int) => `x₂`.>(1))).filter(((`x₃`: scala.Int) => `x₃`.==(2))) Optimized: ls.filter(((x: scala.Int) => x.<(3).&&(x.>(1).&&(x.==(2))))) Result: List(2) 1 2 -Original: ls.filter(((x: scala.Int) => x.<(3))).foreach[scala.Unit](((x: scala.Int) => scala.Predef.println(x))) +Original: ls.filter(((x: scala.Int) => x.<(3))).foreach[scala.Unit](((`x₂`: scala.Int) => scala.Predef.println(`x₂`))) Optimized: ls.foreach[scala.Any](((x: scala.Int) => if (x.<(3)) scala.Predef.println(x) else ())) Result: () diff --git a/tests/run-macros/quote-matching-optimize-3.check b/tests/run-macros/quote-matching-optimize-3.check index cdfcd9b51eb8..14036f0e3a67 100644 --- a/tests/run-macros/quote-matching-optimize-3.check +++ b/tests/run-macros/quote-matching-optimize-3.check @@ -1,19 +1,19 @@ -Original: ls.filter(((x: scala.Int) => x.<(3))).filter(((x: scala.Int) => x.>(1))) -Optimized: ls.filter(((x: scala.Int) => ((x: scala.Int) => x.<(3)).apply(x).&&(((x: scala.Int) => x.>(1)).apply(x)))) +Original: ls.filter(((x: scala.Int) => x.<(3))).filter(((`x₂`: scala.Int) => `x₂`.>(1))) +Optimized: ls.filter(((x: scala.Int) => ((`x₂`: scala.Int) => `x₂`.<(3)).apply(x).&&(((`x₃`: scala.Int) => `x₃`.>(1)).apply(x)))) Result: List(2) -Original: ls2.filter(((x: scala.Char) => x.<('c'))).filter(((x: scala.Char) => x.>('a'))) -Optimized: ls2.filter(((x: scala.Char) => ((x: scala.Char) => x.<('c')).apply(x).&&(((x: scala.Char) => x.>('a')).apply(x)))) +Original: ls2.filter(((x: scala.Char) => x.<('c'))).filter(((`x₂`: scala.Char) => `x₂`.>('a'))) +Optimized: ls2.filter(((x: scala.Char) => ((`x₂`: scala.Char) => `x₂`.<('c')).apply(x).&&(((`x₃`: scala.Char) => `x₃`.>('a')).apply(x)))) Result: List(b) -Original: ls.filter(((x: scala.Int) => x.<(3))).filter(((x: scala.Int) => x.>(1))).filter(((x: scala.Int) => x.==(2))) -Optimized: ls.filter(((x: scala.Int) => ((x: scala.Int) => x.<(3)).apply(x).&&(((x: scala.Int) => ((x: scala.Int) => x.>(1)).apply(x).&&(((x: scala.Int) => x.==(2)).apply(x))).apply(x)))) +Original: ls.filter(((x: scala.Int) => x.<(3))).filter(((`x₂`: scala.Int) => `x₂`.>(1))).filter(((`x₃`: scala.Int) => `x₃`.==(2))) +Optimized: ls.filter(((x: scala.Int) => ((`x₂`: scala.Int) => `x₂`.<(3)).apply(x).&&(((`x₃`: scala.Int) => ((`x₄`: scala.Int) => `x₄`.>(1)).apply(`x₃`).&&(((`x₅`: scala.Int) => `x₅`.==(2)).apply(`x₃`))).apply(x)))) Result: List(2) 1 2 -Original: ls.filter(((x: scala.Int) => x.<(3))).foreach[scala.Unit](((x: scala.Int) => scala.Predef.println(x))) -Optimized: ls.foreach[scala.Any](((x: scala.Int) => if (((x: scala.Int) => x.<(3)).apply(x)) ((x: scala.Int) => scala.Predef.println(x)).apply(x) else ())) +Original: ls.filter(((x: scala.Int) => x.<(3))).foreach[scala.Unit](((`x₂`: scala.Int) => scala.Predef.println(`x₂`))) +Optimized: ls.foreach[scala.Any](((x: scala.Int) => if (((`x₂`: scala.Int) => `x₂`.<(3)).apply(x)) ((`x₃`: scala.Int) => scala.Predef.println(`x₃`)).apply(x) else ())) Result: () Original: ls.map[scala.Long](((a: scala.Int) => a.toLong)).map[java.lang.String](((b: scala.Long) => b.toString())) diff --git a/tests/run-staging/i3876-c.check b/tests/run-staging/i3876-c.check index 38c85ed40818..8d2ee284cf13 100644 --- a/tests/run-staging/i3876-c.check +++ b/tests/run-staging/i3876-c.check @@ -2,7 +2,7 @@ { val f: scala.Function1[scala.Int, scala.Int] { def apply(x: scala.Int): scala.Int - } = ((x: scala.Int) => x.+(x)) + } = ((`x₂`: scala.Int) => `x₂`.+(`x₂`)) (f: scala.Function1[scala.Int, scala.Int] { def apply(x: scala.Int): scala.Int diff --git a/tests/run-staging/i5144.check b/tests/run-staging/i5144.check index 2208504d3403..41a508fae5e6 100644 --- a/tests/run-staging/i5144.check +++ b/tests/run-staging/i5144.check @@ -1,4 +1,4 @@ { - def f(x: scala.Int): scala.Int = ((x: scala.Int) => f(x)).apply(42) + def f(x: scala.Int): scala.Int = ((`x₂`: scala.Int) => f(`x₂`)).apply(42) () -} \ No newline at end of file +} diff --git a/tests/run-staging/i8585.check b/tests/run-staging/i8585.check new file mode 100644 index 000000000000..b1e6081845e3 --- /dev/null +++ b/tests/run-staging/i8585.check @@ -0,0 +1,22 @@ +The following would not compile: +((x: scala.Double) => { + val y: scala.Double = x.*(x) + val `y₂`: scala.Double = y.*(y) + `y₂`.*(`y₂`) +}) +3^8 = 6561.0 +The following would not compile: +((x: scala.Double) => x.*({ + val y: scala.Double = x.*(x) + y.*({ + val `y₂`: scala.Double = y.*(y) + `y₂`.*({ + val `y₃`: scala.Double = `y₂`.*(`y₂`) + `y₃`.*({ + val `y₄`: scala.Double = `y₃`.*(`y₃`) + `y₄`.*(`y₄`) + }) + }) + }) +})) +2^47 = 1.40737488355328E14 diff --git a/tests/run-staging/i8585.scala b/tests/run-staging/i8585.scala new file mode 100644 index 000000000000..4c6b3a1e42a4 --- /dev/null +++ b/tests/run-staging/i8585.scala @@ -0,0 +1,27 @@ +import scala.quoted._ +import scala.quoted.staging.{run, withQuoteContext, Toolbox} + +object Test { + given Toolbox = Toolbox.make(getClass.getClassLoader) + + def main(args: Array[String]): Unit = { + val toTheEighth = stagedPower(8) + println("3^8 = " + toTheEighth(3)) + + val toThe47 = stagedPower(47) + println("2^47 = " + toThe47(2)) + } + + def stagedPower(n: Int): Double => Double = { + def code(using QuoteContext) = '{ (x: Double) => ${ powerCode(n, 'x) } } + println("The following would not compile:") + println(withQuoteContext(code.show)) + run(code) + } + + def powerCode(n: Int, x: Expr[Double])(using ctx: QuoteContext): Expr[Double] = + if (n == 1) x + else if (n == 2) '{ $x * $x } + else if (n % 2 == 1) '{ $x * ${ powerCode(n - 1, x) } } + else '{ val y = $x * $x; ${ powerCode(n / 2, 'y) } } +} diff --git a/tests/run-staging/quote-run-2.check b/tests/run-staging/quote-run-2.check index 7e9019bb7aa9..65be9f6ca1a0 100644 --- a/tests/run-staging/quote-run-2.check +++ b/tests/run-staging/quote-run-2.check @@ -11,11 +11,11 @@ { val y: scala.Double = 5.0.*(5.0) y.*({ - val y: scala.Double = y.*(y) - y.*({ - val y: scala.Double = y.*(y) - val y: scala.Double = y.*(y) - y + val `y₂`: scala.Double = y.*(y) + `y₂`.*({ + val `y₃`: scala.Double = `y₂`.*(`y₂`) + val `y₄`: scala.Double = `y₃`.*(`y₃`) + `y₄` }) }) } diff --git a/tests/run-staging/quote-unrolled-foreach.check b/tests/run-staging/quote-unrolled-foreach.check index 3e923884848e..8e58ab8eed51 100644 --- a/tests/run-staging/quote-unrolled-foreach.check +++ b/tests/run-staging/quote-unrolled-foreach.check @@ -33,7 +33,7 @@ var i: scala.Int = 0 while (i.<(size)) { val element: scala.Int = arr.apply(i) - ((i: scala.Int) => java.lang.System.out.println(i)).apply(element) + ((`i₂`: scala.Int) => java.lang.System.out.println(`i₂`)).apply(element) i = i.+(1) } }) diff --git a/tests/run-staging/shonan-hmm.check b/tests/run-staging/shonan-hmm.check index 96a41ed3ed51..f8da92c01bc2 100644 --- a/tests/run-staging/shonan-hmm.check +++ b/tests/run-staging/shonan-hmm.check @@ -20,10 +20,10 @@ List(25, 30, 20, 43, 44) while (i.<(n)) { vout.update(i, { var sum: scala.Int = 0 - var i: scala.Int = 0 - while (i.<(m)) { - sum = sum.+(v.apply(i).*(a.apply(i).apply(i))) - i = i.+(1) + var `i₂`: scala.Int = 0 + while (`i₂`.<(m)) { + sum = sum.+(v.apply(`i₂`).*(a.apply(i).apply(`i₂`))) + `i₂` = `i₂`.+(1) } (sum: scala.Int) @@ -48,49 +48,49 @@ List(25, 30, 20, 43, 44) val arr: scala.Array[scala.Array[scala.Int]] = { val array: scala.Array[scala.Array[scala.Int]] = dotty.runtime.Arrays.newGenericArray[scala.Array[scala.Int]](5)(scala.reflect.ClassTag.apply[scala.Array[scala.Int]](scala.Predef.classOf[scala.Array[scala.Int]])) array.update(0, { - val array: scala.Array[scala.Int] = new scala.Array[scala.Int](5) - array.update(0, 5) - array.update(1, 0) - array.update(2, 0) - array.update(3, 5) - array.update(4, 0) - array + val `array₂`: scala.Array[scala.Int] = new scala.Array[scala.Int](5) + `array₂`.update(0, 5) + `array₂`.update(1, 0) + `array₂`.update(2, 0) + `array₂`.update(3, 5) + `array₂`.update(4, 0) + `array₂` }) array.update(1, { - val array: scala.Array[scala.Int] = new scala.Array[scala.Int](5) - array.update(0, 0) - array.update(1, 0) - array.update(2, 10) - array.update(3, 0) - array.update(4, 0) - array + val `array₃`: scala.Array[scala.Int] = new scala.Array[scala.Int](5) + `array₃`.update(0, 0) + `array₃`.update(1, 0) + `array₃`.update(2, 10) + `array₃`.update(3, 0) + `array₃`.update(4, 0) + `array₃` }) array.update(2, { - val array: scala.Array[scala.Int] = new scala.Array[scala.Int](5) - array.update(0, 0) - array.update(1, 10) - array.update(2, 0) - array.update(3, 0) - array.update(4, 0) - array + val `array₄`: scala.Array[scala.Int] = new scala.Array[scala.Int](5) + `array₄`.update(0, 0) + `array₄`.update(1, 10) + `array₄`.update(2, 0) + `array₄`.update(3, 0) + `array₄`.update(4, 0) + `array₄` }) array.update(3, { - val array: scala.Array[scala.Int] = new scala.Array[scala.Int](5) - array.update(0, 0) - array.update(1, 0) - array.update(2, 2) - array.update(3, 3) - array.update(4, 5) - array + val `array₅`: scala.Array[scala.Int] = new scala.Array[scala.Int](5) + `array₅`.update(0, 0) + `array₅`.update(1, 0) + `array₅`.update(2, 2) + `array₅`.update(3, 3) + `array₅`.update(4, 5) + `array₅` }) array.update(4, { - val array: scala.Array[scala.Int] = new scala.Array[scala.Int](5) - array.update(0, 0) - array.update(1, 0) - array.update(2, 3) - array.update(3, 0) - array.update(4, 7) - array + val `array₆`: scala.Array[scala.Int] = new scala.Array[scala.Int](5) + `array₆`.update(0, 0) + `array₆`.update(1, 0) + `array₆`.update(2, 3) + `array₆`.update(3, 0) + `array₆`.update(4, 7) + `array₆` }) array } @@ -111,49 +111,49 @@ List(25, 30, 20, 43, 44) val arr: scala.Array[scala.Array[scala.Int]] = { val array: scala.Array[scala.Array[scala.Int]] = dotty.runtime.Arrays.newGenericArray[scala.Array[scala.Int]](5)(scala.reflect.ClassTag.apply[scala.Array[scala.Int]](scala.Predef.classOf[scala.Array[scala.Int]])) array.update(0, { - val array: scala.Array[scala.Int] = new scala.Array[scala.Int](5) - array.update(0, 5) - array.update(1, 0) - array.update(2, 0) - array.update(3, 5) - array.update(4, 0) - array + val `array₂`: scala.Array[scala.Int] = new scala.Array[scala.Int](5) + `array₂`.update(0, 5) + `array₂`.update(1, 0) + `array₂`.update(2, 0) + `array₂`.update(3, 5) + `array₂`.update(4, 0) + `array₂` }) array.update(1, { - val array: scala.Array[scala.Int] = new scala.Array[scala.Int](5) - array.update(0, 0) - array.update(1, 0) - array.update(2, 10) - array.update(3, 0) - array.update(4, 0) - array + val `array₃`: scala.Array[scala.Int] = new scala.Array[scala.Int](5) + `array₃`.update(0, 0) + `array₃`.update(1, 0) + `array₃`.update(2, 10) + `array₃`.update(3, 0) + `array₃`.update(4, 0) + `array₃` }) array.update(2, { - val array: scala.Array[scala.Int] = new scala.Array[scala.Int](5) - array.update(0, 0) - array.update(1, 10) - array.update(2, 0) - array.update(3, 0) - array.update(4, 0) - array + val `array₄`: scala.Array[scala.Int] = new scala.Array[scala.Int](5) + `array₄`.update(0, 0) + `array₄`.update(1, 10) + `array₄`.update(2, 0) + `array₄`.update(3, 0) + `array₄`.update(4, 0) + `array₄` }) array.update(3, { - val array: scala.Array[scala.Int] = new scala.Array[scala.Int](5) - array.update(0, 0) - array.update(1, 0) - array.update(2, 2) - array.update(3, 3) - array.update(4, 5) - array + val `array₅`: scala.Array[scala.Int] = new scala.Array[scala.Int](5) + `array₅`.update(0, 0) + `array₅`.update(1, 0) + `array₅`.update(2, 2) + `array₅`.update(3, 3) + `array₅`.update(4, 5) + `array₅` }) array.update(4, { - val array: scala.Array[scala.Int] = new scala.Array[scala.Int](5) - array.update(0, 0) - array.update(1, 0) - array.update(2, 3) - array.update(3, 0) - array.update(4, 7) - array + val `array₆`: scala.Array[scala.Int] = new scala.Array[scala.Int](5) + `array₆`.update(0, 0) + `array₆`.update(1, 0) + `array₆`.update(2, 3) + `array₆`.update(3, 0) + `array₆`.update(4, 7) + `array₆` }) array } @@ -174,49 +174,49 @@ List(25, 30, 20, 43, 44) val arr: scala.Array[scala.Array[scala.Int]] = { val array: scala.Array[scala.Array[scala.Int]] = dotty.runtime.Arrays.newGenericArray[scala.Array[scala.Int]](5)(scala.reflect.ClassTag.apply[scala.Array[scala.Int]](scala.Predef.classOf[scala.Array[scala.Int]])) array.update(0, { - val array: scala.Array[scala.Int] = new scala.Array[scala.Int](5) - array.update(0, 5) - array.update(1, 0) - array.update(2, 0) - array.update(3, 5) - array.update(4, 0) - array + val `array₂`: scala.Array[scala.Int] = new scala.Array[scala.Int](5) + `array₂`.update(0, 5) + `array₂`.update(1, 0) + `array₂`.update(2, 0) + `array₂`.update(3, 5) + `array₂`.update(4, 0) + `array₂` }) array.update(1, { - val array: scala.Array[scala.Int] = new scala.Array[scala.Int](5) - array.update(0, 0) - array.update(1, 0) - array.update(2, 10) - array.update(3, 0) - array.update(4, 0) - array + val `array₃`: scala.Array[scala.Int] = new scala.Array[scala.Int](5) + `array₃`.update(0, 0) + `array₃`.update(1, 0) + `array₃`.update(2, 10) + `array₃`.update(3, 0) + `array₃`.update(4, 0) + `array₃` }) array.update(2, { - val array: scala.Array[scala.Int] = new scala.Array[scala.Int](5) - array.update(0, 0) - array.update(1, 10) - array.update(2, 0) - array.update(3, 0) - array.update(4, 0) - array + val `array₄`: scala.Array[scala.Int] = new scala.Array[scala.Int](5) + `array₄`.update(0, 0) + `array₄`.update(1, 10) + `array₄`.update(2, 0) + `array₄`.update(3, 0) + `array₄`.update(4, 0) + `array₄` }) array.update(3, { - val array: scala.Array[scala.Int] = new scala.Array[scala.Int](5) - array.update(0, 0) - array.update(1, 0) - array.update(2, 2) - array.update(3, 3) - array.update(4, 5) - array + val `array₅`: scala.Array[scala.Int] = new scala.Array[scala.Int](5) + `array₅`.update(0, 0) + `array₅`.update(1, 0) + `array₅`.update(2, 2) + `array₅`.update(3, 3) + `array₅`.update(4, 5) + `array₅` }) array.update(4, { - val array: scala.Array[scala.Int] = new scala.Array[scala.Int](5) - array.update(0, 0) - array.update(1, 0) - array.update(2, 3) - array.update(3, 0) - array.update(4, 7) - array + val `array₆`: scala.Array[scala.Int] = new scala.Array[scala.Int](5) + `array₆`.update(0, 0) + `array₆`.update(1, 0) + `array₆`.update(2, 3) + `array₆`.update(3, 0) + `array₆`.update(4, 7) + `array₆` }) array }