SICP 読書ノート#45 - RubyでSchemeインタプリタをつくろう(4) - 最初からやり直します
途中まで作っていたRubyによるScheme処理系ですが行き詰まりました。。。
理由はこんな感じです。
rubyによるschemeインタプリタ、ruby上でcons cellを実装してやってたけどlist iterationあたりの実装で限界がきた。rubyのデータ構造に合わせて実装した方がenumrableの恩恵を受けれるし素直な気がする #sicp
— uents (@uents) 2015, 4月 7
当初はSICPのテキスト内容になるべく近づけるために、Rubyの処理系側でも
def pair?(p) p.is_a?(Array) && p.length >= 2 end def cons(a, d) [a].push(d) end def car(p) if (pair?(p)) p[0] else raise "car: invalid argument: " + p.to_s end end def cdr(p) if (pair?(p)) p[1..-1][0] else raise "cdr: invalid argument: " + p.to_s end end
のようにcons cellを実装して進めていたのですが、次第にmap()
やapply()
のiterationの実装まで膨らんできて、処理系の中にさらに小さな処理系を作るような感じで発散してきたので、途中で止めました。
結論としては、SICPをそのまま写経するのではくRubyのデータ構造に合わせて作り変えた方がよくて、今はそれで上手く行きそうな感じが見えてきたところです。
初めて作る処理系なのでこういうこともありますが、Pairs、Listsおよびiterationの実装はそれはそれで勉強になったのでまあ良しとします。
次回は§4.1から再スタートします。