演算子? メソッド?

演算子の「+」や「-」は実際にはメソッド。自己代入演算子の「+=」はシンタックス・シュガーで、実際には「+」で定義されたメソッドが展開されているだけだという。

演算子に見えるものはメソッドなのでオーバーライドできる。

class Fixnum
  def +(n)
    self ** n
  end
end
irb(main):006:0> 3+4
=> 81
irb(main):005:0> a = 3
=> 3
irb(main):004:0> a += 4
=> 81

演算子に見えるものでも「+」はメソッド「=」「!」などは組み込みの演算子という違いがある。買ったまま放置しているGaucheの入門本によると、Schemeでは、こういう区分はなくて、演算子というものは存在しないという。すべては関数で、なんでも再定義できてしまうらしい。そして予約語というのもないので、一見関数を名前にバインドする予約語に見える「define」にすら、まったく異なる関数をバインドできてしまう。それは致命的な結果に結びつく可能性があるけれども、それでもSchemeはそうした自由を制限しないのだという。

ITproにあった「Ruby検定」をやってみたら20問中17問正答で、100点満点とすると85点と自分が思ったより高得点が取れた。ちょうど細かな仕様をざざっと本で読んだばかりだったこともあって、演算子に見えるやつらのうち再定義可能なメソッドはどれか、というような問いにもすんなり回答できた。

しかし、こうしたメソッドと演算子の区別のような恣意的な仕様を学ぶことってプログラミングを学ぶことの本質なのだろうかという疑問もわく。もちろん、恣意的といってもそこにはきっと言語処理系デザイナの長年に渡ると考察や経験が詰め込まれていて、いわゆるベストプラクティスってやつなのだろうけど。