「つくって学ぶプログラミング言語 RubyによるScheme処理系の実装」を読みはじめた

1.2 はじめてのプログラムの評価のところ。

サンプルのパーサをrubyで書いてはいるんだけど、scheme風にするために(is_a? Arrayしてるのをあえてdef list?定義してたり)で書かれていて読むのがつらかった。
とりあえず動きだけ把握したいなーと思って、rubyだけのシンプルな感じで書いてみる。

def primetive_fun(exp)
  {:+ => lambda{|x, y| x + y},
   :- => lambda{|x, y| x - y},
   :* => lambda{|x, y| x * y},
  }[exp]
end

def _eval(exp)
  case exp
  when Array
    fun = _eval(exp[0])
    args = exp[1..-1].map{|x|_eval(x)}
    fun.call(*args)
  when Numeric
    exp
  else
    primetive_fun(exp)
  end
end

p _eval([:+ ,[:-, 1, 5],13])

=>9