SICP 読み (306) 5.5 翻訳系

なんか微妙なエントリが連続しとります。

問題 5.31

現時点で見えてるのは ev-self-eval、ev-variable、ev-quoted な式を eval する場合は stack への退避が不要、という事。
この問題では application な式を eval して apply に渡す直前まで、が範疇と見てるんですが、そーゆー意味では

  • 演算子が上記のナニだった場合、env と unev の退避が不要
  • 引数が上記のナニだった場合、argl と env と unev の退避が不要
  • 最後の引数の場合は argl のみ退避不要

になる、と。
これを前提に例示されている式を見ると

(f 'x 'y)

演算子も引数も評価時のレジスタの stack 退避は不要という事になる。あるいは

((f) 'x 'y)

演算子を評価する時に env と unev の save/restore が必要になる。ちょっと日本語微妙かもしれませんが、その中の (f) の評価においては基本的に save/restore は不要のはず。
あるいは次の

(f (g 'x) y)

については二番目の引数の評価時に argl と env と unev の save/restore 必要。他は省略可能。現時点ではその次の

(f (g 'x) 'y)

も同様なんですがダウト感が残っていますので、別途戻って確認してみたいです。この先 compile な実際が出てくるようですので、もう少しイメージできるようになるはず。てーか、問題文の理解が微妙??
演算子の評価の前後で退避回復が必要なのは env って書き方してるなぁ。上記の箇条書きと微妙な温度差がある。演算子の評価というナニにおいて seq1 は以下のような形になるんでしょうか (演算子が variable が前提ッス)

  (assign unev (op operands) (reg exp))
  (save unev)
  (assign exp (op operator) (reg exp))
  (assign val (op lookup-variable-value) (reg exp) (reg env))
  (restore unev)

seq2 は以下??

  (assign argl (op empty-arglist))
  (assign proc (reg val))
  (test (op no-operands?) (reg unev))
  (branch (label apply-dispatch))
  (save proc)

うーん。これ式な考え方を止めようと思ってるんですが、ついヤってしまうな。これは以降の節を見ていかんとキリが無い。
次の問題も微妙なんですが、明日もナニな時間が確保可能らしい (を