# Why ∀ is an invalid character?

**URL:** <https://discourse.julialang.org/t/why-is-an-invalid-character/45371>\
**Category:** Internals & Design\
**Created:** [August 22, 2020, 3:17pm UTC](https://discourse.julialang.org/t/why-is-an-invalid-character/45371 "2020-08-22T15:17:18Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![anon37204545](https://avatars.discourse-cdn.com/v4/letter/a/439d5e/32.png) [@anon37204545](https://discourse.julialang.org/u/anon37204545)\
**Post date:** [August 22, 2020, 3:17pm UTC](https://discourse.julialang.org/t/why-is-an-invalid-character/45371/1 "2020-08-22T15:17:18Z")

</div>

It seems ∀ (`\forall`) is not allowed for some reason:

```julia
julia> const ∀ = for
ERROR: syntax: invalid character "∀" near column 7

```

Why is that? Is it just because it’s not on one of the character lists in the parser source code?

---

<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:** [August 22, 2020, 3:35pm UTC](https://discourse.julialang.org/t/why-is-an-invalid-character/45371/2 "2020-08-22T15:35:24Z")

</div>

[https://github.com/JuliaLang/julia/issues/19012](https://github.com/JuliaLang/julia/issues/19012)

---

<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:** [August 22, 2020, 4:26pm UTC](https://discourse.julialang.org/t/why-is-an-invalid-character/45371/3 "2020-08-22T16:26:38Z")

</div>

TLDR so that we can decide how they should work without breaking anything.

---

<div class="post-metadata">

**Author:** ![anon37204545](https://avatars.discourse-cdn.com/v4/letter/a/439d5e/32.png) [@anon37204545](https://discourse.julialang.org/u/anon37204545)\
**Post date:** [August 22, 2020, 4:32pm UTC](https://discourse.julialang.org/t/why-is-an-invalid-character/45371/4 "2020-08-22T16:32:07Z")

</div>

But the character is still “disallowed”. What prevents it from being available? I don’t want any special syntax parsing for it, just to be allowed for general use.

You can break pretty much anything, so it’s not a 100% sound reason:

```julia
julia> const + = -
- (generic function with 192 methods)

julia> 1+1
0

```

---

<div class="post-metadata">

**Author:** ![fredrikekre](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fredrikekre/32/1688_2.png) [@fredrikekre](https://discourse.julialang.org/u/fredrikekre)\
**Post date:** [August 22, 2020, 4:35pm UTC](https://discourse.julialang.org/t/why-is-an-invalid-character/45371/5 "2020-08-22T16:35:50Z")

</div>

> [@anon37204545](#):
>
> You can break pretty much anything

Yea but we will not redefine `+` to `-` in Julia base.  
If `∀` was allowed in e.g. variable names, then code like `a∀b = 1` would break if we decide we want to introduce `∀` as an operator.

---

<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:** [August 22, 2020, 4:41pm UTC](https://discourse.julialang.org/t/why-is-an-invalid-character/45371/6 "2020-08-22T16:41:09Z")

</div>

Incidentally,

```julia
const <...anything...> = for

```

will not work as `for` is a keyword and the parser will expect the relevant forms after it.

---

<div class="post-metadata">

**Author:** ![Henrique\_Becker](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/henrique_becker/32/15443_2.png) [@Henrique\_Becker](https://discourse.julialang.org/u/Henrique_Becker)\
**Post date:** [August 22, 2020, 10:17pm UTC](https://discourse.julialang.org/t/why-is-an-invalid-character/45371/7 "2020-08-22T22:17:40Z")

</div>

> [@Tamas\_Papp](#):
>
> will not work as `for` is a keyword

This is specially important. You are trying to use a `const` variable as it was a `C` macro, you want that any reference to that token/name is replaced by the code in the right-hand side in any context. This would never work. You can use a macro to do this replacement for you in a restrict scope and `∀` will need to be `:∀` (probably).

---

<div class="post-metadata">

**Author:** ![Mason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mason/32/2423_2.png) [@Mason](https://discourse.julialang.org/u/Mason)\
**Post date:** [August 22, 2020, 11:48pm UTC](https://discourse.julialang.org/t/why-is-an-invalid-character/45371/8 "2020-08-22T23:48:44Z")

</div>

You need to use string macros here or a special repl mode if you want this syntax.

```julia
using ReplMaker
using REPL: LineEdit

iscomplete(x) = true
function iscomplete(ex::Expr)
    if ex.head == :incomplete
        false
    else
        true
    end
end

function valid_code(s)
    input = String(take!(copy(LineEdit.buffer(s))))
    iscomplete(parse_forall(input))
end

function parse_forall(s::String)
    Meta.parse(replace(s, "∀" => "for"))
end

```

```julia
julia> initrepl(parse_forall,
                prompt_text="∀ julia> ",
                prompt_color = :blue,
                start_key=')',
                mode_name="∀_mode",
                valid_input_checker=valid_code)
REPL mode ∀_mode initialized. Press ) to enter and backspace to exit.

∀ julia> [x^2 + 1 ∀ x ∈ -3:3]
7-element Array{Int64,1}:
 10
  5
  2
  1
  2
  5
 10

∀ julia> ∀ x ∈ 1:4
             @show x + 1
         end
x + 1 = 2
x + 1 = 3
x + 1 = 4
x + 1 = 5

```
