Julia 用户定义的中缀运算符

Julia 用户定义的中缀运算符,julia,Julia,我知道Julia中的运算符只是标准函数,我可以使用 普通前缀调用语法: julia> +(1, 2) 3 然而,它们也很特别,因为它们可以(而且通常是) 用作中缀运算符: julia> 1+2 3 我可以定义自己的中缀运算符吗?如果是,怎么做? 例如: julia> α(x, y) = x+y α (generic function with 1 method) julia> α(1, 2) 3 # as expected julia> 1α2 # exp

我知道Julia中的运算符只是标准函数,我可以使用 普通前缀调用语法:

julia> +(1, 2)
3
然而,它们也很特别,因为它们可以(而且通常是) 用作中缀运算符:

julia> 1+2
3

我可以定义自己的中缀运算符吗?如果是,怎么做?

例如:

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
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

正如您所说的,运算符只是标准函数,您可以定义和 否则像其他函数一样进行操作。然而,Julia的解析器是 配置为将某一组符号识别为中缀运算符;如果你 定义一个名称为这些符号之一的函数,它将被解析为 中缀运算符

例如:

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
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

可以找到识别为中缀运算符的符号列表(以及相关的优先级)。对于 大多数情况下,此列表是(符号, 数学)

目前,它包括例如:

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
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
  • 以与
    +
    相同的优先级进行分析:
  • 以与
    *
    相同的优先级进行分析:

从技术上讲,您还可以使用几乎任何其他符号作为中缀运算符,并具有宏的功能!(如果你真的想的话)。我有一个
@infix
黑客(它依赖于并置的隐式乘法)这样做:
julia>使用infix函数@中缀α(x,y)=x+y;1 |α| 2
。(这是为我自己开发的一个宏练习,它不适用于julia 1.x。)