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章に突入したいがどうなるやら。