問題解答
問2.3
対角上の二点を指定する方法で表現。
(define (make-rectangle lb rt) (cons lb rt)) (define (rect-lb rect) (car rect)) (define (rect-rt rect) (cdr rect)) (define (w rect) (- (x-point (rect-rt rect)) (x-point (rect-lb rect)))) (define (h rect) (- (y-point (rect-rt rect)) (y-point (rect-lb rect)))) (define (perimeter rect) (* (+ (w rect) (h rect)) 2)) (define (area rect) (* (w rect) (h rect))) (define rect (make-rectangle (make-point 0 0) (make-point 1 1))) (display (perimeter rect)) (display (area rect))
基点と幅、高さを指定する方法で表現
(define (make-rectangle base w h) (cons base (cons w h))) (define (w rect) (car (cdr rect)) (define (h rect) (cdr (cdr rect)) (define rect (make-rectangle (make-point 0 0) 1 1)) (display (perimeter rect)) (display (area rect))
構成子と選択子は表現にあわせて用意し、計算は共通のものを使用できている。
本文
2.1.3 データとは何か
cons, car, cdr を実装してみる。 cons で手続きを返すことで実現。
問題
問2.4
(define (cons x y) (lambda (m) (m x y))) (define (car z) (z (lambda (p q) p))) (define (cdr z) (z (lambda (p q) q))) (car (cons 1 2)) (cdr (cons 1 2))
置換えモデルを使用して動作を確認
(car (cons 1 2)) (car (lambda (m) (m 1 2))) ((lambda (m) (m 1 2)) (lambda (p q) p)) ((lambda (p q) p) 1 2) 1