class Foo { static +(other) { "infix %(this) + %(other)" } static -(other) { "infix %(this) - %(other)" } static *(other) { "infix %(this) * %(other)" } static /(other) { "infix %(this) / %(other)" } static %(other) { "infix %(this) \% %(other)" } static <(other) { "infix %(this) < %(other)" } static >(other) { "infix %(this) > %(other)" } static <=(other) { "infix %(this) <= %(other)" } static >=(other) { "infix %(this) >= %(other)" } static ==(other) { "infix %(this) == %(other)" } static !=(other) { "infix %(this) != %(other)" } static &(other) { "infix %(this) & %(other)" } static |(other) { "infix %(this) | %(other)" } static is(other) { "infix %(this) is %(other)" } static ! { "prefix !%(this)" } static ~ { "prefix ~%(this)" } static - { "prefix -%(this)" } static [a] { "%(this) 1-subscript %(a)" } static [a, b] { "%(this) 2-subscript %(a) %(b)" } static [a, b, c] { "%(this) 3-subscript %(a) %(b) %(c)" } static [a]=(value) { "%(this) 1-subscript setter %(a) = %(value)" } static [a, b]=(value) { "%(this) 2-subscript setter %(a) %(b) = %(value)" } static [a, b, c]=(value) { "%(this) 3-subscript setter %(a) %(b) %(c) = %(value)" } } System.print(Foo + "a") // expect: infix Foo + a System.print(Foo - "a") // expect: infix Foo - a System.print(Foo * "a") // expect: infix Foo * a System.print(Foo / "a") // expect: infix Foo / a System.print(Foo % "a") // expect: infix Foo % a System.print(Foo < "a") // expect: infix Foo < a System.print(Foo > "a") // expect: infix Foo > a System.print(Foo <= "a") // expect: infix Foo <= a System.print(Foo >= "a") // expect: infix Foo >= a System.print(Foo == "a") // expect: infix Foo == a System.print(Foo != "a") // expect: infix Foo != a System.print(Foo & "a") // expect: infix Foo & a System.print(Foo | "a") // expect: infix Foo | a System.print(!Foo) // expect: prefix !Foo System.print(~Foo) // expect: prefix ~Foo System.print(-Foo) // expect: prefix -Foo System.print(Foo is "a") // expect: infix Foo is a System.print(Foo["a"]) // expect: Foo 1-subscript a System.print(Foo["a", "b"]) // expect: Foo 2-subscript a b System.print(Foo["a", "b", "c"]) // expect: Foo 3-subscript a b c System.print(Foo["a"] = "value") // expect: Foo 1-subscript setter a = value System.print(Foo["a", "b"] = "value") // expect: Foo 2-subscript setter a b = value System.print(Foo["a", "b", "c"] = "value") // expect: Foo 3-subscript setter a b c = value