3imp 読んでみる (6)
今日は雨なのでがっつりデキるか、と思ってたら天候回復傾向。
- (apply) : accumulator にあるクロージャを current rib を引数に、で良いのでしょうか。ええと正確にはこのインストラクションはクロージャの環境をクロージャの変数のリストと current rib で拡張。current environment を新しい current environment にセットして next expression をクロージャの body にする、との事
- (return) : 先頭フレームを stack から除去して current environment、current rib、next expression、current stack をリセット。
なんとなく気になるのが record の使われ方。定義が以下
(record (var ...) val (exp ...)) → (apply (lambda (var ...) exp ...) val)
VM における return のナニは以下で良い??
- next expression の car が return の場合
- (record '() '() (record s (x e r s) (VM a x e r s)))
vars も (cdr r) も空のハズ。と上記の式はまず
(apply (lambda () (record s (x e r s) (VM a x e r s))) ())
さらに以下
(apply (lambda () (apply (lambda (s) (VM a x e r s)) (x e r s))) ())
ちょっとまだ全体が見えてないので上記の式と (return) の解説とが自分の中で整合しない。とりあえず先を見る事に。
3.4.2 Translation
scheme の手続きがようやく出てきた。試験を書きましょう、な前に定義しとかんといけんソレ達をなんとかしないと。
- cond はスルー
- record-case は define-syntax する
- tail? (これは下方面で手続き定義があった
- recur は define-syntax
とりあえず tail? の定義をメモっておくと以下
(define (tail? next) (eq? (car next) 'return))
next expressin の car が return だったら末尾と見てるのか。あと recur を再掲
(define-syntax recur (syntax-rules () ((_ f ([v i] ...) e ...) ((rec f (lambda (v ...) e ...)) i ...))))
次はとりあえず record の定義ですが以下で良いのかな。
(define-syntax record (syntax-rules () ((_ (var ...) val exp ...) (apply (lambda (var ...) exp ...) val))))
試験
gosh> (define-syntax record (syntax-rules () ((_ (var ...) val exp ...) (apply (lambda (var ...) exp ...) val)))) #<undef> gosh> ((lambda (x) (record (a b c) x (list c b a))) '(1 2 3)) (3 2 1) gosh>
良いのでしょうか。とりあえずヨシとしておきます。で、record-case はハマるはずなのでここで一旦エントリ投入。