用户定义的中缀运算符


10

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

Answers:


14

如您所说,运算符只是标准函数,您可以像其他函数一样定义和操作它们。但是,Julia的解析器配置为将某些符号集识别为中缀运算符。如果定义名称为这些符号之一的函数,它将被解析为中缀运算符。

例如:

julia> ⊕(x, y) = x+y
 (generic function with 1 method)

# standard prefix function call
julia> ⊕(1, 2)
3

# infix operator call
julia> 12
3

julia> 1  2
3


可以在Julia分析器源代码中找到被识别为中缀运算符(以及相关的优先级)的符号列表。在大多数情况下,此列表是unicode类别Sm(符号,数学)的子集。

目前,它包括例如:

  • 解析的优先级与+
+ -        ±                 
                         
  • 解析的优先级与*
* / ÷ % &   ×                   
          ⦿             
                       

7
从技术上讲,您还可以使用几乎所有其他符号作为宏功能的中缀运算符!(如果您确实想要)。我有一个@infix 黑客认为这样做(它由并列依赖于隐含的乘法)julia> using InfixFunctions; @infix α(x, y) = x + y; 1 |α| 2。(它InfixFunctions.jl是为我自己制定的一项宏观练习,它本身无法与julia 1.x一起使用。)
SalchiPapa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.