用户定义的中缀运算符

ffe*_*tte 12 julia

我知道 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)

  • 从技术上讲,您还可以使用几乎*任何*其他符号作为具有宏功能的中缀运算符!(如果你真的想的话)。我有一个 `@infix` **hack** (它依赖于并置的隐式乘法),它做到了这一点:`julia> using InfixFunctions; @infix α(x, y) = x + y; 1 |α| 2`. ([`InfixFunctions.jl`](https://github.com/SalchiPapa/InfixFunctions.jl) 是作为我自己的宏观练习而开发的,它不适用于 julia 1.x。) (8认同)