[Raku] 如何定義運算符

作者:   發佈於:   #rakulang

「運算符」一詞,指的是帶有計算意義的各種特殊符號。常見的是四則運算中的加減乘除,在 Raku 語中分別對應到 +-*/ 這四個符號。

這四個符號的使用方式,都是要放在左右兩個「運算子」的中間。如 $a + 42 這麼寫了之後,就表示出了一個新的值,其值與 $a42 之和相同。

如果哪天我們得要定義一個新的運算符,並且在使用時也希望時能將其寫在左右兩運算子中間,那該則麼做呢?

以一個簡單的數值運算為例:我們希望有某個運算符能代表「左右兩個數值的平均值」,也就是 ($a + $b) / 2 這個運算。而我們選擇以「avg」這個符號來表記。那麼可以這麼定義:

sub infix:<ave> (Num() $a, Num() $b) {
    return ($a + $b) / 2;
}


my $x = 41 ave 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

其實這種要寫在兩個運算子中間的運算符號,也可視為是一種函式,只是書寫時位置不太一樣。函式名稱要寫在運算子前面,而中綴運算符號要寫在運算子中間。但兩種表記方式,都代表了「對這些運算子進行某種計算」的這個意義。