`(Hello ,world)

ツッコミ、添削大歓迎です。いろいろ教えてください。

2008-04-13

スタックベースのScheme実装

| 06:06

3章はデータ構造も簡単で英語もわかりやすかったけど、4章のスタックベースになって内容が難しくなって、だいぶ英語の本文の意味をつかめないまま読み進めているので、ほとんどわかってない。display closure がどうとかいうはなしになってわけわからん。

  • no title が参考になる
  • ひとつハマったこと:set-member? 関数の中で、
(define set-member?
  (lambda (x s)
    (cond
     ((null? s) '())
     ...
    • と、x が s に含まれなかったときに '() を返している。また含んでいるときは 't を返している。Gauche では空リストは真と評価されるので動作がおかしくなる。#f や #t を返すようにする。
      • はてなブログ '() を真とするのはScheme の仕様か、Schemeはところどころ妙な嫌がらせがあるよなぁ。ちゃんと細部を考えてプログラムを書かないと、デフォルト動作はわざとハマる側に倒してあるという印象を受ける、#<undef>といい'()といい…。
    • ひょっとして Chez Scheme では '() も偽なのかと思ったがわからず…

ヒープベースのScheme実装

| 10:57

Three implementation models for scheme」の3章のヒープベース実装を読んだ。RubyでSchemeを作ってみたよ今度こそ。 - &lt;s&gt;gnarl,&lt;/s&gt;技術メモ”’&lt;marquee&gt;&lt;textarea&gt;¥もこれを元に作られていたんだなぁと実感。いろいろわからないこと:

  • rib ってなに?
  • nuate?
  • 3章だけでヒープベースのコンパイラVMはできる。ただ、これだとひとつの式しかコンパイルできないからどうするのかなぁというのが疑問。compile に next で次の式を渡せばいいんだけど、そうすると今からコンパイルする式よりも先に次の式をコンパイルしないといけないけど大丈夫なのかな。
  • グローバル環境をどうするのか。コンパイラはあらかじめ変数へのアクセスをインデクスにしてしまうので、define で変数をあとから追加できないんじゃないか? assign 命令がきたときに lookup が失敗するのでは。
    • トップの環境のけつに追加すればインデクスはずれない、からそうする?
    def compile_lookup(var)
      root = env = self
      skip_env = 0
      while env
        root = env
        index = env.table.index(var)
        return [skip_env, index] if index
        env = env.parent
        skip_env += 1
      end
      root.table << var
      [skip_env - 1, root.table.size - 1]
    end
      • でもこれだと、未束縛の変数を参照しただけでグローバル環境に作られてしまいそう
      • Cとかと違って後方参照もできるようにする場合には、そうしないとだめか
  • REPLを作るにしても、VM して終わったときには環境が失われてしまうのでできるのか。
(let ((repl '())) 
  (set! repl (lambda () 
               (princ "> ") 
               (print (eval (read))) 
               (repl))) 
  (repl)) 
トラックバック - http://cadr.g.hatena.ne.jp/mokehehe/20080413