Juliaでのユーザー定義演算子の種類

JuliaはUnicodeで文字が使えますから、

```julia
🐼(x,y) = x*y
```
のように適当な文字から作った関数を定義して

```julia
🐼(2,3)
```

```
6
```
を実行できます。

そして、一部の文字の場合、

```julia
⊕(x,y) = x * y
```
と関数を定義して、

```julia
4 ⊕ 5
```
のような形で「演算子」のように扱うことができます。

一方、

```
julia> 2 🐼 3
ERROR: syntax: extra token "🐼" after end of expression
Stacktrace:
 [1] top-level scope at none:1
```
はできません。どの記号ができてどの記号ができないのでしょうか？



## 確認環境
Julia 1.5.2

## 使える文字
https://stackoverflow.com/questions/60321301/user-defined-infix-operator
を参考にしますと、

```
+ - ⊕ ⊖ ⊞ ⊟ ∪ ∨ ⊔ ± ∓ ∔ ∸ ≏ ⊎ ⊻ ⊽ ⋎ ⋓ ⧺ ⧻ ⨈ ⨢ ⨣ ⨤ ⨥ ⨦
⨧ ⨨ ⨩ ⨪ ⨫ ⨬ ⨭ ⨮ ⨹ ⨺ ⩁ ⩂ ⩅ ⩊ ⩌ ⩏ ⩐ ⩒ ⩔ ⩖ ⩗ ⩛ ⩝ ⩡ ⩢ ⩣
```
と

```
* / ÷ % & ⋅ ∘ × ∩ ∧ ⊗ ⊘ ⊙ ⊚ ⊛ ⊠ ⊡ ⊓ ∗ ∙ ∤ ⅋ ≀ ⊼ ⋄ ⋆ ⋇
⋉ ⋊ ⋋ ⋌ ⋏ ⋒ ⟑ ⦸ ⦼ ⦾ ⦿ ⧶ ⧷ ⨇ ⨰ ⨱ ⨲ ⨳ ⨴ ⨵ ⨶ ⨷ ⨸ ⨻
⨼ ⨽ ⩀ ⩃ ⩄ ⩋ ⩍ ⩎ ⩑ ⩓ ⩕ ⩘ ⩚ ⩜ ⩞ ⩟ ⩠ ⫛ ⊍ ▷ ⨝ ⟕ ⟖ ⟗
```
は
演算子として定義できるようです。

## 記号による違い
前者の集団は「+のような働き方をする演算子」、後者の集団は「*のような働き方をする演算子」として定義されているようです。
違いはなんでしょうか？

例えば、前者に属する記号である⊕を用いて

```julia
⊕(x,y) = x * y
println("⊕: ",3 + 4 ⊕ 5)
```
を実行すると、

```
⊕: 35
```
が出力されます。
これは、3 + 4をして7を得た後に、7と5をかけて35が出ています。つまり、順番に計算されています。
一方、後者に属する記号である⊗の場合には、

```julia
⊗(x,y) = x * y
println("⊗: ",3 + 4 ⊗ 5)
```
は

```
⊗: 23
```
が出力されます。これは、4と5をかけて20を得てから、3+20をして23が得られています。
つまり、足し算的な演算よりも、掛け算的演算を先にやる、というルールのようです。


## 確かめ
上記で示されている記号全部を確かめてみました。

ちょっと面倒でしたが、こんな感じで確かめました。

```julia
⊕(x,y) = x * y
println("⊕: ",3 + 4 ⊕ 5)
⊖(x,y) = x * y
println("⊖: ",3 + 4 ⊖ 5)
⊞(x,y) = x * y
println("⊞: ",3 + 4 ⊞ 5)
⊟(x,y) = x * y
println("⊟: ",3 + 4 ⊟ 5)
∪(x,y) = x * y
println("∪: ",3 + 4 ∪ 5)
∨(x,y) = x * y
println("∨: ",3 + 4 ∨ 5)
⊔(x,y) = x * y
println("⊔: ",3 + 4 ⊔ 5)
±(x,y) = x * y
println("±: ",3 + 4 ± 5)
∓(x,y) = x * y
println("∓: ",3 + 4 ∓ 5)
∔(x,y) = x * y
println("∔: ",3 + 4 ∔ 5)
∸(x,y) = x * y
println("∸: ",3 + 4 ∸ 5)
≏(x,y) = x * y
println("≏: ",3 + 4 ≏ 5)
⊎(x,y) = x * y
println("⊎: ",3 + 4 ⊎ 5)
⊻(x,y) = x * y
println("⊻: ",3 + 4 ⊻ 5)
⊽(x,y) = x * y
println("⊽: ",3 + 4 ⊽ 5)
⋎(x,y) = x * y
println("⋎: ",3 + 4 ⋎ 5)
⋓(x,y) = x * y
println("⋓: ",3 + 4 ⋓ 5)
⧺(x,y) = x * y
println("⧺: ",3 + 4 ⧺ 5)
⧻(x,y) = x * y
println("⧻: ",3 + 4 ⧻ 5)
⨈(x,y) = x * y
println("⨈: ",3 + 4 ⨈ 5)
⨢(x,y) = x * y
println("⨢: ",3 + 4 ⨢ 5)
⨣(x,y) = x * y
println("⨣: ",3 + 4 ⨣ 5)
⨤(x,y) = x * y
println("⨤: ",3 + 4 ⨤ 5)
⨥(x,y) = x * y
println("⨥: ",3 + 4 ⨥ 5)
⨦(x,y) = x * y
println("⨦: ",3 + 4 ⨦ 5)
⨧(x,y) = x * y
println("⨧: ",3 + 4 ⨧ 5)
⨨(x,y) = x * y
println("⨨: ",3 + 4 ⨨ 5)
⨩(x,y) = x * y
println("⨩: ",3 + 4 ⨩ 5)
⨪(x,y) = x * y
println("⨪: ",3 + 4 ⨪ 5)
⨫(x,y) = x * y
println("⨫: ",3 + 4 ⨫ 5)
⨬(x,y) = x * y
println("⨬: ",3 + 4 ⨬ 5)
⨭(x,y) = x * y
println("⨭: ",3 + 4 ⨭ 5)
⨮(x,y) = x * y
println("⨮: ",3 + 4 ⨮ 5)
⨹(x,y) = x * y
println("⨹: ",3 + 4 ⨹ 5)
⨺(x,y) = x * y
println("⨺: ",3 + 4 ⨺ 5)
⩁(x,y) = x * y
println("⩁: ",3 + 4 ⩁ 5)
⩂(x,y) = x * y
println("⩂: ",3 + 4 ⩂ 5)
⩅(x,y) = x * y
println("⩅: ",3 + 4 ⩅ 5)
⩊(x,y) = x * y
println("⩊: ",3 + 4 ⩊ 5)
⩌(x,y) = x * y
println("⩌: ",3 + 4 ⩌ 5)
⩏(x,y) = x * y
println("⩏: ",3 + 4 ⩏ 5)
⩐(x,y) = x * y
println("⩐: ",3 + 4 ⩐ 5)
⩒(x,y) = x * y
println("⩒: ",3 + 4 ⩒ 5)
⩔(x,y) = x * y
println("⩔: ",3 + 4 ⩔ 5)
⩖(x,y) = x * y
println("⩖: ",3 + 4 ⩖ 5)
⩗(x,y) = x * y
println("⩗: ",3 + 4 ⩗ 5)
⩛(x,y) = x * y
println("⩛: ",3 + 4 ⩛ 5)
⩝(x,y) = x * y
println("⩝: ",3 + 4 ⩝ 5)
⩡(x,y) = x * y
println("⩡: ",3 + 4 ⩡ 5)
⩢(x,y) = x * y
println("⩢: ",3 + 4 ⩢ 5)
⩣(x,y) = x * y
println("⩣: ",3 + 4 ⩣ 5)


⋅(x,y) = x * y 
println("⋅: ",3 + 4 ⋅ 5)
∘(x,y) = x * y 
println("∘: ",3 + 4 ∘ 5)
×(x,y) = x * y
println("×: ",3 + 4 × 5)
∩(x,y) = x * y
println("∩: ",3 + 4 ∩ 5)
∧(x,y) = x * y
println("∧: ",3 + 4 ∧ 5)
⊗(x,y) = x * y
println("⊗: ",3 + 4 ⊗ 5)
⊘(x,y) = x * y
println("⊘: ",3 + 4 ⊘ 5)
⊙(x,y) = x * y
println("⊙: ",3 + 4 ⊙ 5)
⊚(x,y) = x * y
println("⊚: ",3 + 4 ⊚ 5)
⊛(x,y) = x * y
println("⊛: ",3 + 4 ⊛ 5)
⊠(x,y) = x * y
println("⊠: ",3 + 4 ⊠ 5)
⊡(x,y) = x * y
println("⊡: ",3 + 4 ⊡ 5)
⊓(x,y) = x * y
println("⊓: ",3 + 4 ⊓ 5)
∗(x,y) = x * y
println("∗: ",3 + 4 ∗ 5)
∙(x,y) = x * y
println("∙: ",3 + 4 ∙ 5)
∤(x,y) = x * y
println("∤: ",3 + 4 ∤ 5)
⅋(x,y) = x * y
println("⅋: ",3 + 4 ⅋ 5)
≀(x,y) = x * y
println("≀: ",3 + 4 ≀ 5)
⊼(x,y) = x * y
println("⊼: ",3 + 4 ⊼ 5)
⋄(x,y) = x * y
println("⋄: ",3 + 4 ⋄ 5)
⋆(x,y) = x * y
println("⋆: ",3 + 4 ⋆ 5)
⋇(x,y) = x * y
println("⋇: ",3 + 4 ⋇ 5)
⋉(x,y) = x * y
println("⋉: ",3 + 4 ⋉ 5)
⋊(x,y) = x * y
println("⋊: ",3 + 4 ⋊ 5)
⋋(x,y) = x * y
println("⋋: ",3 + 4 ⋋ 5)
⋌(x,y) = x * y
println("⋌: ",3 + 4 ⋌ 5)
⋏(x,y) = x * y
println("⋏: ",3 + 4 ⋏ 5)
⋒(x,y) = x * y
println("⋒: ",3 + 4 ⋒ 5)
⟑(x,y) = x * y
println("⟑: ",3 + 4 ⟑ 5)
⦸(x,y) = x * y
println("⦸: ",3 + 4 ⦸ 5)
⦼(x,y) = x * y
println("⦼: ",3 + 4 ⦼ 5)
⦾(x,y) = x * y
println("⦾: ",3 + 4 ⦾ 5)
⦿(x,y) = x * y
println("⦿: ",3 + 4 ⦿ 5)
⧶(x,y) = x * y
println("⧶: ",3 + 4 ⧶ 5)
⧷(x,y) = x * y
println("⧷: ",3 + 4 ⧷ 5)
⨇(x,y) = x * y
println("⨇: ",3 + 4 ⨇ 5)
⨰(x,y) = x * y
println("⨰: ",3 + 4 ⨰ 5)
⨱(x,y) = x * y
println("⨱: ",3 + 4 ⨱ 5)
⨲(x,y) = x * y
println("⨲: ",3 + 4 ⨲ 5)
⨳(x,y) = x * y
println("⨳: ",3 + 4 ⨳ 5)
⨴(x,y) = x * y
println("⨴: ",3 + 4 ⨴ 5)
⨵(x,y) = x * y
println("⨵: ",3 + 4 ⨵ 5)
⨶(x,y) = x * y
println("⨶: ",3 + 4 ⨶ 5)
⨷(x,y) = x * y
println("⨷: ",3 + 4 ⨷ 5)
⨸(x,y) = x * y
println("⨸: ",3 + 4 ⨸ 5)
⨻(x,y) = x * y
println("⨻: ",3 + 4 ⨻ 5)
⨼(x,y) = x * y
println("⨼: ",3 + 4 ⨼ 5)
⨽(x,y) = x * y
println("⨽: ",3 + 4 ⨽ 5)
⩀(x,y) = x * y
println("⩀: ",3 + 4 ⩀ 5)
⩃(x,y) = x * y
println("⩃: ",3 + 4 ⩃ 5)
⩄(x,y) = x * y
println("⩄: ",3 + 4 ⩄ 5)
⩋(x,y) = x * y
println("⩋: ",3 + 4 ⩋ 5)
⩍(x,y) = x * y
println("⩍: ",3 + 4 ⩍ 5)
⩎(x,y) = x * y
println("⩎: ",3 + 4 ⩎ 5)
⩑(x,y) = x * y
println("⩑: ",3 + 4 ⩑ 5)
⩓(x,y) = x * y
println("⩓: ",3 + 4 ⩓ 5)
⩕(x,y) = x * y
println("⩕: ",3 + 4 ⩕ 5)
⩘(x,y) = x * y
println("⩘: ",3 + 4 ⩘ 5)
⩚(x,y) = x * y
println("⩚: ",3 + 4 ⩚ 5)
⩜(x,y) = x * y
println("⩜: ",3 + 4 ⩜ 5)
⩞(x,y) = x * y
println("⩞: ",3 + 4 ⩞ 5)
⩟(x,y) = x * y
println("⩟: ",3 + 4 ⩟ 5)
⩠(x,y) = x * y
println("⩠: ",3 + 4 ⩠ 5)
⫛(x,y) = x * y
println("⫛: ",3 + 4 ⫛ 5)
⊍(x,y) = x * y
println("⊍: ",3 + 4 ⊍ 5)
▷(x,y) = x * y
println("▷: ",3 + 4 ▷ 5)
⨝(x,y) = x * y
println("⨝: ",3 + 4 ⨝ 5)
⟕(x,y) = x * y
println("⟕: ",3 + 4 ⟕ 5)
⟖(x,y) = x * y
println("⟖: ",3 + 4 ⟖ 5)
⟗(x,y) = x * y
println("⟗: ",3 + 4 ⟗ 5)

```

これを実行すると、
出力結果は、

```
⊕: 35
⊖: 35
⊞: 35
⊟: 35
∪: 35
∨: 35
⊔: 35
±: 35
∓: 35
∔: 35
∸: 35
≏: 35
⊎: 35
⊻: 35
⊽: 35
⋎: 35
⋓: 35
⧺: 35
⧻: 35
⨈: 35
⨢: 35
⨣: 35
⨤: 35
⨥: 35
⨦: 35
⨧: 35
⨨: 35
⨩: 35
⨪: 35
⨫: 35
⨬: 35
⨭: 35
⨮: 35
⨹: 35
⨺: 35
⩁: 35
⩂: 35
⩅: 35
⩊: 35
⩌: 35
⩏: 35
⩐: 35
⩒: 35
⩔: 35
⩖: 35
⩗: 35
⩛: 35
⩝: 35
⩡: 35
⩢: 35
⩣: 35
⋅: 23
∘: 23
×: 23
∩: 23
∧: 23
⊗: 23
⊘: 23
⊙: 23
⊚: 23
⊛: 23
⊠: 23
⊡: 23
⊓: 23
∗: 23
∙: 23
∤: 23
⅋: 23
≀: 23
⊼: 23
⋄: 23
⋆: 23
⋇: 23
⋉: 23
⋊: 23
⋋: 23
⋌: 23
⋏: 23
⋒: 23
⟑: 23
⦸: 23
⦼: 23
⦾: 23
⦿: 23
⧶: 23
⧷: 23
⨇: 23
⨰: 23
⨱: 23
⨲: 23
⨳: 23
⨴: 23
⨵: 23
⨶: 23
⨷: 23
⨸: 23
⨻: 23
⨼: 23
⨽: 23
⩀: 23
⩃: 23
⩄: 23
⩋: 23
⩍: 23
⩎: 23
⩑: 23
⩓: 23
⩕: 23
⩘: 23
⩚: 23
⩜: 23
⩞: 23
⩟: 23
⩠: 23
⫛: 23
⊍: 23
▷: 23
⨝: 23
⟕: 23
⟖: 23
⟗: 23
```
となりました。ちゃんと前者と後者に分かれていることがわかります。