# X++ operator

**URL:** <https://discourse.julialang.org/t/x-operator/51066>\
**Category:** Internals & Design\
**Tags:** question\
**Created:** [December 1, 2020, 8:32pm UTC](https://discourse.julialang.org/t/x-operator/51066 "2020-12-01T20:32:43Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![marllos](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marllos/32/205917_2.png) [@marllos](https://discourse.julialang.org/u/marllos)\
**Post date:** [December 1, 2020, 8:32pm UTC](https://discourse.julialang.org/t/x-operator/51066/1 "2020-12-01T20:32:43Z")

</div>

Are there plans to implement an operator like x++? Can it be created by the user? Thanks.

---

<div class="post-metadata">

**Author:** ![tomerarnon](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tomerarnon/32/3170_2.png) [@tomerarnon](https://discourse.julialang.org/u/tomerarnon)\
**Post date:** [December 1, 2020, 8:44pm UTC](https://discourse.julialang.org/t/x-operator/51066/2 "2020-12-01T20:44:28Z")

</div>

The `++` operator exists as a user extensible operator, but it is infix rather than postfix. That is, `x++` is not a valid expression but `x ++ y` is.

---

<div class="post-metadata">

**Author:** ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)\
**Post date:** [December 2, 2020, 12:05am UTC](https://discourse.julialang.org/t/x-operator/51066/3 "2020-12-02T00:05:24Z")

</div>

Assuming you’re talking about the [increment operator](https://en.wikipedia.org/wiki/Increment_and_decrement_operators) like in C, you can mimic the pre-increment `++i` with a macro:

```julia
julia> macro ++(x::Symbol)
           return :( $(esc(x)) = $(esc(x)) + 1 )
       end
@++ (macro with 1 method)

julia> i = 2
2

julia> @++ i
3

julia> i
3

```

---

<div class="post-metadata">

**Author:** ![StefanKarpinski](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stefankarpinski/32/24_2.png) [@StefanKarpinski](https://discourse.julialang.org/u/StefanKarpinski)\
**Post date:** [December 2, 2020, 12:13am UTC](https://discourse.julialang.org/t/x-operator/51066/4 "2020-12-02T00:13:10Z")

</div>

You can write `x += 1` to increment `x`.

---

<div class="post-metadata">

**Author:** ![anon92994695](https://avatars.discourse-cdn.com/v4/letter/a/ce7236/32.png) [@anon92994695](https://discourse.julialang.org/u/anon92994695)\
**Post date:** [December 2, 2020, 12:53am UTC](https://discourse.julialang.org/t/x-operator/51066/5 "2020-12-02T00:53:03Z")

</div>

make it a package! PlusPlus.jl?

---

<div class="post-metadata">

**Author:** ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)\
**Post date:** [December 2, 2020, 1:00am UTC](https://discourse.julialang.org/t/x-operator/51066/6 "2020-12-02T01:00:21Z")

</div>

> [@anon92994695](#):
>
> PlusPlus.jl

[Name taken](https://github.com/tlienart/PlusPlus.jl), [twice](https://github.com/pkofod/PlusPlus.jl)

---

<div class="post-metadata">

**Author:** ![tbeason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tbeason/32/15898_2.png) [@tbeason](https://discourse.julialang.org/u/tbeason)\
**Post date:** [December 2, 2020, 2:41am UTC](https://discourse.julialang.org/t/x-operator/51066/7 "2020-12-02T02:41:33Z")

</div>

But this one would be better, so… PlusPlusPlus.jl?

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [December 2, 2020, 2:43am UTC](https://discourse.julialang.org/t/x-operator/51066/8 "2020-12-02T02:43:27Z")

</div>

and they do the \*same thing (almost) the same way…

---

<div class="post-metadata">

**Author:** ![marllos](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marllos/32/205917_2.png) [@marllos](https://discourse.julialang.org/u/marllos)\
**Post date:** [December 2, 2020, 2:50am UTC](https://discourse.julialang.org/t/x-operator/51066/9 "2020-12-02T02:50:58Z")

</div>

I’ll take a look at PlusPlus.jl. I really like the syntax of C and also Julia. I thought a native x++ would be nice. I actually use x += 1.

---

<div class="post-metadata">

**Author:** ![marllos](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marllos/32/205917_2.png) [@marllos](https://discourse.julialang.org/u/marllos)\
**Post date:** [December 2, 2020, 2:52am UTC](https://discourse.julialang.org/t/x-operator/51066/10 "2020-12-02T02:52:13Z")

</div>

Thanks.

---

<div class="post-metadata">

**Author:** ![goretkin](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/goretkin/32/167_2.png) [@goretkin](https://discourse.julialang.org/u/goretkin)\
**Post date:** [December 2, 2020, 3:06am UTC](https://discourse.julialang.org/t/x-operator/51066/11 "2020-12-02T03:06:17Z")

</div>

To be fair, `x++` would probably not promote the type the way that `x += 1` does. Perhaps instead `x += true`, though I don’t claim to like using boolean literals for the purpose of preventing promotion.

```julia
julia> Meta.@lower x += 1
:($(Expr(:thunk, CodeInfo(
    @ none within `top-level scope'
1 ─ %1 = x + 1
│ x = %1
└── return %1
))))

```

```julia
julia> typeof(Int8(3) + 1)
Int64

julia> typeof(Int8(3) + true)
Int8

```

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [December 2, 2020, 9:33am UTC](https://discourse.julialang.org/t/x-operator/51066/12 "2020-12-02T09:33:38Z")

</div>

> [@marllos](#):
>
> I thought a native x++ would be nice.

I am not sure that C’s `++` increment would be a good fit for Julia. First, recall that `x` can be any generic value (eg a `Date`), so the generic solution is most likely

```julia
x += oneunit(x)

```

which is shorthand for `x = x + oneunit(x)`.

While `++` could expand to this, the hidden/implicit `=` it would introduce its own host of complications (eg surprises in [scoping](https://docs.julialang.org/en/v1/manual/variables-and-scoping/)).

Also, `++` used extensively for loops & similar in C/C++. Julia has higher level constructs, you so situations where you have to manually increment counters are more rare.

---

<div class="post-metadata">

**Author:** ![StefanKarpinski](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stefankarpinski/32/24_2.png) [@StefanKarpinski](https://discourse.julialang.org/u/StefanKarpinski)\
**Post date:** [December 2, 2020, 1:59pm UTC](https://discourse.julialang.org/t/x-operator/51066/13 "2020-12-02T13:59:11Z")

</div>

This is a good observation: while there are some constructs like `+=` that expand to assignment, at least they all involve the `=` somewhere in the syntax, which serves as a hint that an assignment is occurring. In C, assignment is not so significant since you have to explicitly declare every variable (I was habitually about write C/C++, but assignment is very significant, subtle and complex in C++, so I’m intentionally leaving it out). C also has a model where variables do actually behave semantically like memory locations (you can take an address of any variable), whereas in Julia a variable is just a name associated with a value.
