Opérateur d'infixe défini par l'utilisateur

10

Je sais que les opérateurs de Julia ne sont que des fonctions standard et je peux les utiliser en utilisant la syntaxe d'appel de préfixe ordinaire:

julia> +(1, 2)
3

Cependant, ils sont également spéciaux dans le sens où ils peuvent être (et sont généralement) utilisés comme opérateurs d'infixe:

julia> 1+2
3


Puis-je définir mon propre opérateur d'infixe? Si c'est le cas, comment?

Par exemple:

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
François Févotte
la source

Réponses:

14

Comme vous l'avez dit, les opérateurs ne sont que des fonctions standard, que vous pouvez définir et manipuler comme n'importe quelle autre fonction. Cependant, l'analyseur de Julia est configuré pour reconnaître un certain ensemble de symboles en tant qu'opérateurs d'infixe; si vous définissez une fonction dont le nom est l'un de ces symboles, elle sera analysée en tant qu'opérateur infixe.

Par exemple:

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


La liste des symboles reconnus comme opérateurs infixes (et la priorité associée) peut être trouvée dans le code source de l'analyseur Julia . Pour la plupart, cette liste est un sous-ensemble de la catégorie Unicode Sm (symbole, mathématiques).

Pour le moment, il comprend par exemple:

  • analysé avec la même priorité que +:
+ -        ±                 
                         
  • analysé avec la même priorité que *:
* / ÷ % &   ×                   
          ⦿             
                       
François Févotte
la source
7
Vous pouvez également utiliser techniquement presque n'importe quel autre symbole comme opérateur d'infixe avec la puissance des macros! (si vous voulez vraiment). J'ai eu une @infix entaille (il repose sur la multiplication implicite par juxtaposition) qui a fait ceci: julia> using InfixFunctions; @infix α(x, y) = x + y; 1 |α| 2. (a InfixFunctions.jlété développé comme un exercice macro pour moi, il ne fonctionne pas avec julia 1.x tel
quel