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 はハマるはずなのでここで一旦エントリ投入。