# .. (two dots) as a operator name

**URL:** <https://discourse.julialang.org/t/two-dots-as-a-operator-name/85611>\
**Category:** General Usage\
**Created:** [August 11, 2022, 10:26am UTC](https://discourse.julialang.org/t/two-dots-as-a-operator-name/85611 "2022-08-11T10:26:52Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![owiecc](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/owiecc/32/8894_2.png) [@owiecc](https://discourse.julialang.org/u/owiecc)\
**Post date:** [August 11, 2022, 10:26am UTC](https://discourse.julialang.org/t/two-dots-as-a-operator-name/85611/1 "2022-08-11T10:26:52Z")

</div>

[IntervalSets.jl](https://github.com/JuliaMath/IntervalSets.jl) defines `..` as a [interval operator](https://github.com/JuliaMath/IntervalSets.jl/blob/b3f0d6ebcb8718f2e14168280237ea014a01d8f6/src/interval.jl#L85). I tried using `...` as an operator but Julia complains that it is an invalid identifier name. This means that `..` is treated somewhat special. Where can I find the list of legal operators and are there any other special ones, like the `..`?

---

<div class="post-metadata">

**Author:** ![Sukera](https://avatars.discourse-cdn.com/v4/letter/s/ce7236/32.png) [@Sukera](https://discourse.julialang.org/u/Sukera)\
**Post date:** [August 11, 2022, 10:37am UTC](https://discourse.julialang.org/t/two-dots-as-a-operator-name/85611/2 "2022-08-11T10:37:41Z")

</div>

How did you try to define it? It works for me:

```julia
julia> ..(a,b) = a:b
.. (generic function with 1 method)

julia> 3..4
3:4

```

What error exactly do you get for your code?

---

<div class="post-metadata">

**Author:** ![owiecc](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/owiecc/32/8894_2.png) [@owiecc](https://discourse.julialang.org/u/owiecc)\
**Post date:** [August 11, 2022, 10:53am UTC](https://discourse.julialang.org/t/two-dots-as-a-operator-name/85611/3 "2022-08-11T10:53:56Z")

</div>

Two dots work. Try doing that with `...` (three dots).

---

<div class="post-metadata">

**Author:** ![Sukera](https://avatars.discourse-cdn.com/v4/letter/s/ce7236/32.png) [@Sukera](https://discourse.julialang.org/u/Sukera)\
**Post date:** [August 11, 2022, 11:00am UTC](https://discourse.julialang.org/t/two-dots-as-a-operator-name/85611/4 "2022-08-11T11:00:28Z")

</div>

Yes. It’s not `..` that’s special, but `...`, since it is handled specially during lowering:

```julia
julia> Meta.@lower add(xs...) = reduce(+, xs)
:($(Expr(:thunk, CodeInfo(
    @ none within `top-level scope`
1 ─ $(Expr(:thunk, CodeInfo(
    @ none within `top-level scope`
1 ─ return $(Expr(:method, :add))
)))
│ $(Expr(:method, :add))
│ %3 = Core.Typeof(add)
│ %4 = Core.apply_type(Vararg, Core.Any)
│ %5 = Core.svec(%3, %4)
│ %6 = Core.svec()
│ %7 = Core.svec(%5, %6, $(QuoteNode(:(#= REPL[2]:1 =#))))
│ $(Expr(:method, :add, :(%7), CodeInfo(
    @ REPL[2]:1 within `none`
1 ─ %1 = reduce(+, xs)
└── return %1
)))
└── return add
))))

```

You can’t override the splatting/slurping operator.

---

<div class="post-metadata">

**Author:** ![owiecc](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/owiecc/32/8894_2.png) [@owiecc](https://discourse.julialang.org/u/owiecc)\
**Post date:** [August 11, 2022, 11:02am UTC](https://discourse.julialang.org/t/two-dots-as-a-operator-name/85611/5 "2022-08-11T11:02:42Z")

</div>

True, I forgot about slurping. It seems that it parses three or more dots as a slurping operator.

Is there a way then of defining `....` as an operator or does it need to be hard coded somewhere in Julia’s parser?

---

<div class="post-metadata">

**Author:** ![Jollywatt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jollywatt/32/202198_2.png) [@Jollywatt](https://discourse.julialang.org/u/Jollywatt)\
**Post date:** [August 11, 2022, 11:49am UTC](https://discourse.julialang.org/t/two-dots-as-a-operator-name/85611/6 "2022-08-11T11:49:11Z")

</div>

I like to survey the [parser source code](https://github.com/JuliaLang/julia/blob/08a9c12f829b0c1f2a9d65882543fda7d18347f0/src/julia-parser.scm) when looking for candidate characters for my own obscure operators. Take note of built-in operator precedences (increasing as you go down) and make sure it won’t surprise you later on.
