3imp 読んでみる (13)

Reading Gauche が進捗している。ちょっと今日晩の対応は無理そげ。昼間も若干微妙なんですが開き直ってヤッてみようかな。環境も微妙なんだよなぁ。
current environment を拡張しとけば良いのは分かるんですが、どう考えても SICP 方式で primitive なソレは目印を付けて別な方法取らないと動かなさげ。
そーゆー意味では primitive-procedure-objs な手続きは昨晩なエントリのソレでは微妙。元の通り

(define (primitive-procedure-objs)
  (map (lambda (proc) (list 'primitive (cadr proc)))
       primitive-procedures))

にしといた方が良さげ。そしたら後は

           [apply ()
;;              (record a (body e vars)
              (record (body e vars) a
                  (VM a body (extend e vars r) '() s))]

なソレを何とかするだけ??
primitive だったら a に入っている (primitive #) の cadr を apply (って引数は?) すれば良い、のだろうか。引数は current rib に格納されてるはずなので apply できるはずだな。こんなカンジ??

	       [apply ()
		      (if (primitive? a)
			  (apply (cadr a) r)
			  (record (body e vars) a
				  (VM a body (extend e vars r) '() s)))]

最初、(apply a r) とかヤッてた。上記だと #t がもどってきてるので試験ダウト、なメセジがナニ。よく考えたらここで終わっちゃ駄目じゃん。

	       [apply ()
		      (if (primitive? a)
			  (VM (apply (cadr a) r) '(return) e r s)
			  (record (body e vars) a
				  (VM a body (extend e vars r) '() s)))]

これで試験パス。ちなみに primitive 関連な手続きで追加したのが以下

(define (primitive? l)
  (eq? 'primitive (car l)))
(define primitive-proc
  (list (list '= =)
	(list 'car car)
	(list 'cdr cdr)
	))
(define primitive-procedure-names
  (map car primitive-proc))
(define primitive-procedure-objs
  (map (lambda (proc) (list 'primitive (cadr proc)))
       primitive-proc))
(define (init-env)
  (extend '() primitive-procedure-names primitive-procedure-objs))

これで一応 primitive なソレが盛り込めるのでしょうか。まだ追試必要だと思います。

明日

なんとか Reading Gauche なゲンジツトウヒを何とかしたい、ってリソース許せば、なのですが。ええと

  • スクリプト送った
  • gtags 入れないと
  • Gauche なソース

他に何が必要なんだっけ (を

追記

next expression が return 固定は微妙だな。