7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

🐼(x,y) = x*y

のように適当な文字から作った関数を定義して

🐼(2,3)
6

を実行できます。

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

(x,y) = x * y

と関数を定義して、

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
を参考にしますと、

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

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


演算子として定義できるようです。

記号による違い

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

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

(x,y) = x * y
println("⊕: ",3 + 4  5)

を実行すると、

⊕: 35

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

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

⊗: 23

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

確かめ

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

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

(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

となりました。ちゃんと前者と後者に分かれていることがわかります。

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?