It seems ∀ (\forall
) is not allowed for some reason:
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?
It seems ∀ (\forall
) is not allowed for some reason:
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?
TLDR so that we can decide how they should work without breaking anything.
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> const + = -
- (generic function with 192 methods)
julia> 1+1
0
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.
Incidentally,
const <...anything...> = for
will not work as for
is a keyword and the parser will expect the relevant forms after it.
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).
You need to use string macros here or a special repl mode if you want this syntax.
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> 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