; 2.1.3 (define (cons x y) (define (dispatch m) (cond ((= m 0) x) ((= m 1) y) (else (error "error")))) dispatch) (define (car z) (z 0)) (define (cdr z) (z 1))
티스토리에 소스를 올리는게 넘 불편해서 github repository를 하나 만들었습니다. 앞으로 소스 코드는 여기에 올리는게 어떨지? 이참에 분산 VCS인 git에 대해서도 알아보는건? ^^
커밋을 하려면 github에 가입하고도, 몇 가지 준비가 필요하니 한번 논의해 보시죠.
; ex 2.2 ; point (define (make-point x y) (cons x y)) (define (x-point p) (car p)) (define (y-point p) (cdr p)) (define (point2str p) (format "(~a,~a)" (x-point p) (y-point p))) (define (print-point p) (newline) (display (point2str p))) ; segment (define (make-segment p1 p2) (cons p1 p2)) (define (start-segment s) (car s)) (define (end-segment s) (cdr s)) (define (segment2str s) (format "~a->~a" (point2str (start-segment s)) (point2str (end-segment s)))) (define (print-segment s) (newline) (display (segment2str s))) (define (midpoint-segment s) (define (average a b) (/ (+ a b) 2)) (let ((p1 (start-segment s)) (p2 (end-segment s))) (make-point (average (x-point p1) (x-point p2)) (average (y-point p1) (y-point p2))))) ; ex 2.3 ; rect (define (make-rect tl-point br-point) (cons tl-point br-point)) ;(define (make-rect p1 p2) (cons p1 p2)) (define (top-left-rect r) (car r)) (define (top-right-rect r) (make-point (x-point (cdr r)) (y-point (car r)))) (define (bottom-left-rect r) (make-point (x-point (car r)) (y-point (cdr r)))) (define (bottom-right-rect r) (cdr r)) ;(define (top-left-rect r) ; (let ((x1 (x-point (car r))) ; (y1 (y-point (car r))) ; (x2 (x-point (cdr r))) ; (y2 (y-point (cdr r)))) ; (make-point (min x1 x2) (max y1 y2)))) ;(define (top-right-rect r) ; (let ((x1 (x-point (car r))) ; (y1 (y-point (car r))) ; (x2 (x-point (cdr r))) ; (y2 (y-point (cdr r)))) ; (make-point (max x1 x2) (max y1 y2)))) ;(define (bottom-left-rect r) ; (let ((x1 (x-point (car r))) ; (y1 (y-point (car r))) ; (x2 (x-point (cdr r))) ; (y2 (y-point (cdr r)))) ; (make-point (min x1 x2) (min y1 y2)))) ;(define (bottom-right-rect r) ; (let ((x1 (x-point (car r))) ; (y1 (y-point (car r))) ; (x2 (x-point (cdr r))) ; (y2 (y-point (cdr r)))) ; (make-point (max x1 x2) (min y1 y2)))) (define (rect2str r) (format "tl=~a\ntr=~a\nbl=~a\nbr=~a" (top-left-rect r) (top-right-rect r) (bottom-left-rect r) (bottom-right-rect r))) (define (print-rect r) (newline) (display (rect2str r))) (define (width-rect r) (- (x-point (top-right-rect r)) (x-point (top-left-rect r)))) (define (height-rect r) (- (y-point (top-left-rect r)) (y-point (bottom-left-rect r)))) (define (area-rect r) (* (width-rect r) (height-rect r))) (define (girth-rect r) (+ (* (width-rect r) 2) (* (height-rect r) 2)))