R で ?dist のようにして使うヘルプ機能は大変便利だが、演算子について調べようとすると 演算子のヘルプ - ryamadaのコンピュータ・数学メモ(2018年9月に引越し) で記されているように不思議な挙動をする。例えば加算演算子+を調べるのに、? "+" や ? +3 は目的のページを開くが、? + では継続行になってしまう。一方、? 3 + sqrt(4) のようにしても + の説明が表示される。ソースコードに戻って調べてみた。
まず、"?" の実装を調べる。help("?")とすると冒頭に "Question {utils}" と書いてあるので、utils パッケージの question を見ればよいと分かる。つまり http://svn.r-project.org/R/trunk/src/library/utils/R/question.R だ。? 関数の型は function(e1, e2) である。substitute で引数をトークンに分解して、最初のトークンを検索キーワードとして使っているようだ。もちろん、スコープ指定の ::: などが頭についたときはしかるべき対応をしている。
通常の関数呼び出しなら、func("abc") のような括弧付きとなる。? は括弧なしでも呼び出せるように、文法上、演算子扱いされている(?Syntax 参照)。実装は http://svn.r-project.org/R/trunk/src/main/gram.y を見れば分かる。expr(式) の定義として、? expr または expr ? expr が含まれている。したがって、? の後には式が要求される。単独の + は式ではないから、?+ は動かない。+ expr は式だから、+3 は式となり ?+3 は動作する。
なお、演算子はバッククォートすることで関数として呼び出せる。すなわち、1 + 2 は `+`(1, 2) と同じである。同様に、`?`("+") や `?`("+3") や `?`(+3) なども期待した動作をする。
それから、演算子は再定義することができる。例えば、
`?` <- function(e1, e2){cat("? is no longer available ;-)")} ? help
というイタズラが可能だ。