さくらんぼのlambda日記

lambdaちっくなことからゲーム開発までいろいろ書きます。

eval蹂躙

Rubyのmainについて議論をまとめてみます(一方的に教わっただけとも言う)

  1. RubyのTopLevelはmainというObjectとして実行される(p selfすれば分かる)
  2. Objectなので@hogeとかするとインスタンス変数を宣言もできる
  3. 自分でdefして作ったメソッドはmainのprivate_methodとして追加されている
  4. mainにはKernelモジュールがMix-inされている


ここで、Kernelモジュールの関数を上書きしてしまうとその動作を変更することができて
便利です。しかも100%全員が読むことが決定している訳です(mainを呼ばないRubyプログラムは存在しない)


ここでevalを上書きしてしまえばリーダーマクロもどきがきっとできる
というわけです。その前段階として、evalを乗っ取ってみます。

module Kernel 
  alias :eval_old :eval
  def eval(str)
    puts "らめぇ"
    eval_old str
  end
end
eval "puts 'hogehogehoge'"

それでは早速実行。
ターミナルから実行します。
良い子はirb使った方が良いでしょう。

[sakura@Pachouli]$ruby eval.rb
らめぇ
hogehogehoge

すばらしいですね。
evalを書き換えることができました。
これでstrを自分の思い通りに書き換えてあげれば
気持ち悪いコードでもやり放題です。