我知道 Julia 中的运算符只是标准函数,我可以使用普通的前缀调用语法来使用它们:
julia> +(1, 2)
3
Run Code Online (Sandbox Code Playgroud)
但是,它们也很特殊,因为它们可以(并且通常)用作中缀运算符:
julia> 1+2
3
Run Code Online (Sandbox Code Playgroud)
我可以定义自己的中缀运算符吗?如果是这样,如何?
例如:
julia> ?(x, y) = x+y
? (generic function with 1 method)
julia> ?(1, 2)
3 # as expected
julia> 1?2
# expected result: 3
ERROR: UndefVarError: ?2 not defined
Stacktrace:
[1] top-level scope at REPL[5]:1
julia> 1 ? 2
# expected result: 3
ERROR: syntax: extra token "?" after end of expression
Stacktrace:
[1] top-level scope at REPL[5]:0
Run Code Online (Sandbox Code Playgroud)
ffe*_*tte 17
正如您所说,运算符只是标准函数,您可以像任何其他函数一样定义和操作它们。然而,Julia 的解析器被配置为将一组特定的符号识别为中缀运算符;如果您定义一个函数,其名称是这些符号之一,它将被解析为中缀运算符。
例如:
julia> ?(x, y) = x+y
? (generic function with 1 method)
# standard prefix function call
julia> ?(1, 2)
3
# infix operator call
julia> 1?2
3
julia> 1 ? 2
3
Run Code Online (Sandbox Code Playgroud)
可在 Julia 解析器源代码中找到识别为中缀运算符(和相关优先级)的符号列表。在大多数情况下,此列表是unicode 类别 Sm(符号、数学)的子集。
目前,它包括例如:
+:+ - ? ? ? ? ? ? ? ± ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Run Code Online (Sandbox Code Playgroud)
*:* / ÷ % & ? ? × ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Run Code Online (Sandbox Code Playgroud)