[Raku] 如何定義運算符
作者:gugod 發佈於: ,更新於: #rakulang #howto「運算符」一詞,指的是帶有計算意義的各種特殊符號。常見的是四則運算中的加減乘除,在 Raku 語中分別對應到 +
、-
、*
、/
這四個符號。
這四個符號的使用方式,都是要放在左右兩個「運算子」的中間。如 $a + 42
這麼寫了之後,就表示出了一個新的值,其值與 $a
與 42
之和相同。
如果哪天我們得要定義一個新的運算符,並且在使用時也希望時能將其寫在左右兩運算子中間,那該則麼做呢?
以一個簡單的數值運算為例:我們希望有某個運算符能代表「左右兩個數值的平均值」,也就是 ($a + $b) / 2
這個運算。而我們選擇以「avg
」這個符號來表記。那麼可以這麼定義:
sub infix:<avg> (Num() $a, Num() $b) {
return ($a + $b) / 2;
}
my $x = 41 avg 43;
say $x;
#=> 42
又或者,也可以把 Unicode 中的表情符號字符拿來當作數值運算符號:
sub infix:<😐> (Num() $a, Num() $b) {
return ($a + $b) / 2;
}
my $x = 41 😐 43;
say $x;
#=> 42
不難看出這賦予符號某種計算意義的語法,其實就是一般定義函式的語法。只是在函式名稱的部分,多包裝了層 infix:< >
這串字。
"infix" (或稱:中綴)就是表示:這符號是「點綴在兩個運算子的中間」。除了中綴,也有前綴 (prefix) 、後綴 (postfix)與環綴 (circumfix,或稱「前後綴」)。C 語言中的 ++
既是後綴也是前綴。數學上常見的前綴符號有 ∑
,環綴符號有積分 ∫ ... dx
。
其實這種要寫在兩個運算子中間的運算符號,也可視為是一種函式,只是書寫時位置不太一樣。函式名稱要寫在運算子前面,而中綴運算符號要寫在運算子中間。但兩種表記方式,都代表了「對這些運算子進行某種計算」的這個意義。