EoPL reading (129) 2.3 Representation Strategies for Data Types

Exercise 2.26

うーん。難解。Figure 2.5 を参考に手続きを書けば良いのは分かってるんですが。
とりあえず

(define-datatype reference reference?
  (a-ref
    (position integer?)
    (vec vector?)))

を使う、ということは cell という名前のコンストラクタには position と値を渡せば良いのかな。one-element vector という事なので

(define cell
  (lambda (pos datum)
    (let ((ref (a-ref pos (vector datum))))
      (letrec ((cell?

みたいなカンジで良いのかな。最後らへんは

        (vector cell? contents setcell))))
(define cell-get-predicate-operation
  (lambda (c) (vector-ref c 0)))
(define cell-get-getter-operation
  (lambda (c) (vector-ref c 1)))
(define cell-get-setter-operation
  (lambda (c) (vector-ref c 2)))

でナニ。この中身が大事ですな。仮で以下をでっち上げてみた。

(define cell
  (lambda (pos datum)
    (let ((ref (a-ref pos (vector datum))))
      (letrec ((cell? (lambda () '()))
	       (contents (lambda () '()))
	       (setcell (lambda () '())))
	(vector cell? contents setcell)))))
(define cell-get-predicate-operation
  (lambda (c) (vector-ref c 0)))
(define cell-get-getter-operation
  (lambda (c) (vector-ref c 1)))
(define cell-get-setter-operation
  (lambda (c) (vector-ref c 2)))

む。これって cell という手続きが戻すのは属性付きのベクタなのか。という事は cell? は無条件に #t を戻せば良いし、contents は one-element vector なので vector の 0 番目の中身を戻せば良いはず。

      (letrec ((cell? (lambda () #t))
	       (contents (lambda ()
			   (cases reference ref
				  (a-ref (pos datum)
					 (vector-ref 0 datum)))))

いちいち cases を通さないと中身が取れんのは微妙だな。以下はダウトなのだろうか。

	       (contents (lambda ()
;;			   (cases reference ref
;;				  (a-ref (pos datum)
;;					 (vector-ref 0 datum)))))
			   (vector-ref 0 (caddr ref))

うーん。それは良いとして最後の setcell がナニ。問題の文章としては

and setcell stores its second argument in the first argument, which must be a cell.

とあるんですが上記をどう解釈したものやら。試験もスルーしてるんですが、今日はへろへろなので寝る支度します。

と言いつつ追記

こうすりゃ良さげ。

(define cell-get-setter-operation
  (lambda (c) (vector-ref c 2)))
(define setcell
  (lambda (c i)
    ((cell-get-setter-operation c) i)))

あ、中身の定義が略だ。明日朝イチで検討して投入して3章に突入したいがどうなるやら。