C# ライブ配信をしていて、「括弧用の記号の種類が少なすぎる」みたいな話題から、 「あるよ、括弧。Unicode には」みたいな話になり、 「Swift ではマジでいろんな記号が使える」という話に脱線したときの話。
配信では「括弧がたくさんある」という話と「Swift では演算子にいろんな文字が使える」という話が混ざっていて、 実際に Swift で色々使えるのは括弧ではないんですけど、演算子の方は本当に Swift で使えるものがかなり自由が効く仕様になっていまして。 例えば以下のコードはコンパイルして実行できます。 (1から5の和で、15が出力されます。)
prefix operator ∑
prefix func ∑ (x: [Int]) -> Int {
var sum = 0
for i in x {
sum += i
}
return sum
}
let Σ = [ 1, 2, 3, 4, 5 ]
print(∑Σ)
∑Σ
。
シグマシグマ。
ちなみにこれ、同じ記号に見えて実は違う文字でして。
- (1個目の)∑ : U+2211。数学記号の「和」の意味のシグマ。
- (2個目の)Σ : U+03A3。ギリシャ文字大文字のシグマ。
Swift は、
という仕様になっているので、上記のようなコードが合法になります。
シグマとシグマ
まあ、「なんで文字コード分けた」という話ではあります。 Unicode、同じような意味、読み、形の文字は統合する方針じゃないの? シグマとシグマを分けるんだったら、日中韓漢字統合(いわゆる中華フォント問題)とかやめてよ…
そしてまあ、同じようなことができる組み合わせは他にもいろいろとあります。 ぱっと思いつくのは以下のようなもの。
パイ:
- ∏ : U+220F。数学記号の「積」の意味のパイ。
- Π : U+03A0。ギリシャ文字大文字のパイ。
long S:
- ∫ : U+222B。積分記号。積分記号自体が「S を引き延ばしたもの」が由来。
-
ʃ : U+0283。発音記号の "esh"。S 亜種の発音。
- letter 扱いらしく、変数名に使える。
Union:
- ∪: U+222A。Union (和集合)の数学記号。
- U: U+0055。ローマ字の(ASCII コード中にある) U の大文字。
c の丸囲み:
- © : U+00A9。コピーライト記号。演算子にできるらしい…
-
c⃝: U+0063 U+20DD。c に combining enclosing circle を付けて丸囲み。
- サポートしているフォントは少ないものの、ものによっては © と似たような描画をされるはず。
- letter + diacritical mark なので変数名に使える。
他に ℵ(U+2135。ヘブライ文字を元にした数学記号のアレフ)と א (U+05D0。元々のヘブライ文字のアレフ)とかも思いついたんですけど、これは両方後も letter (変数名に使えて、演算子には使えない文字)でした。 ちなみにこのアレフに至っては、数学記号の方は L to R (左書き)、ヘブライ文字の方は R to L (右書き)の文字で、後ろに続く文字のレンダリングに影響を及ぼしたりします。