読者です 読者をやめる 読者になる 読者になる

@uents blog

Code wins arguments.

SICP 読書ノート#45 - RubyでSchemeインタプリタをつくろう(4) - 最初からやり直します

途中まで作っていたRubyによるScheme処理系ですが行き詰まりました。。。

理由はこんな感じです。

当初は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から再スタートします。


※「SICP読書ノート」の目次はこちら