BLOG ARTICLE Announce/Chapter.2 | 11 ARTICLE FOUND

  1. 2011.03.15 Chapter.2 스터디 일정 (2)
  2. 2011.01.16 ch 2.2.2 계층구조
  3. 2011.01.11 ch 2.1.4 집중 과제: 구간 산술 연산 만들기
  4. 2011.01.05 연습문제 2.6
  5. 2011.01.05 연습문제 2.4 ~ 2.5
  6. 2011.01.05 2.1.3
  7. 2011.01.01 연습문제 2.2 ~ 2.3
  8. 2011.01.01 2.1.2
  9. 2011.01.01 연습문제 2.1
  10. 2011.01.01 2.1.1

1월 4일 (화)
  • 발표 : 유훈종(intro, 2.1.1, 2.1.2, 2.1.3)
1월 6일 (목)
  • 리뷰 : 유훈종 (intro, 2.1.1, 2.1.2, 2.1.3)
  • 발표 : 유승근 (2.1.4)
1월 11일 (화)
  • 리뷰 : 정다정 (2.1.4)
  • 발표 : 유훈종 (2.2.1)
1월 13일 (목)
  • 리뷰 : 전현철 (2.2.1)
  • 발표 : 유승근 (2.2.2)
1월 18일 (화)
  • 리뷰 : 유승근 (2.2.2)
  • 발표 : 전현철 (2.2.3-a)
1월 20일 (목)
  • 리뷰 : 유훈종 (2.2.3-a)
  • 발표 : 정다정 (2.2.3-b)
1월 27일 (목)
  • 리뷰 : 생략
  • 발표 : 전현철 (~겹친매핑, 2.2.3 완료), 정다정 (2.2.3-b)
2월 8일 (화)
  • 리뷰 : 전현철
  • 발표 : 유승근 (2.2.4, ~그림틀)
2월 10일 (목)
  • 리뷰 : 생략
  • 발표 : 전현철 (2.2.4 완료)
2월 15일 (화)
  • 리뷰 : 전현철
  • 발표 : 유승근, 전현철(~ 2.3.2)
  • 문제풀이 : 유승근(2.53, 2.54, 2.55), 유훈종(2.56, 2.57), 전현철(2.58)
2월 17일 (목)
  • 리뷰 : 전현철
  • 발표 : 정다정(~ 2.3.3 - ex.2.62)
  • 문제풀이 : 유승근(2.59), 유훈종(2.60), 전현철(2.61), 정다정(2.62)
2월 22일 (화)
  • 리뷰 : 유승근
  • 발표 : 유훈종(~ 2.3.3)
  • 문제풀이 : 전현철(2.63 ~ 2.65)
2월 24일 (목)
  • 리뷰 : 전현철
  • 발표 : 정다정(~ 2.3.4)
  • 문제풀이 : 전현철(2.67, 2.68), 유승근(2.69, 2.70), 유훈종(2.71, 2.72)
3월 3일 (목)
  • 리뷰 : 유훈종
  • 발표 : 전현철(2.4.1), 정다정(2.4.2)
3월 10일 (목)
  • 리뷰 : 전현철
  • 발표 : ~(2.4.3)
3월 17일 (목)
  • 발표 : 전현철(2.4.3), 가능하다면 2.5.1
  • 문제풀이 : 정다정(2.73), 유승근(2.74), 유훈종(2.75), 전현철(2.76)
3월 24일 (목)
  • 발표 : 정다정(2.5.1)
  • 문제풀이 : 정다정(2.77), 전현철(2.78), 유승근(2.79), 유훈종(2.80)
4월 1일 (금)
  • 범위 : 2.5.2
  • 문제풀이 : 개별 풀이 진행
5월 3일 (화)
  • 범위 : 2.5.2 ~ 2.5.3 (마무리~)
신고

2.2.1에서 값만 포함된 차례열(sequence)를 대상으로 표현 방법과 연산을 짜 보았다면, 2.2.2에서는 이를 일반화하여 원소에 차례열이 있는 경우까지로 확장하여 설명한다. 그림으로 나타내면 나무꼴 형태가 되며, 주어진 인자가 값인지 쌍인지 확인하기 위해 pair? 술어 프로시저를 사용할 수 있다.

연습문제 2.28 fringe 프로시저를 짜는 부분이 직관적으로 다가오지 않는다. 연습문제 2.24~2.29는 github 참조. 특히 연습문제 2.29 풀이는 스터디 시간에 풀이한 line 420~459 코드가 좀 더 명확하니 참고하시길.

저작자 표시 비영리
신고

소스 코드는 github suguni/sicp/ch2.1.rkt 참조. line 256 부터 시작함.

2.14~2.16에 대한 해석 추가

책에 정의되어 있는 interval 데이터에 대한 산술연산 프로시저의 결정적 문제는 항등원이 정의되어 있지 않다는 점이다. 즉, A / A = I, A * I = A 를 만족하는 항등원이 정의되어 있지 않다. 2.16에서 말한 흠이 없는 구간-산술 연산 꾸러미를 만드는 것은 항등원을 먼저 정의하고, 이에 따라 위 조건에 맞는 *, / 연산을 다시 짜야 한다. *,/ 연산을 재정의 한 것(실패함)에 대한 내용은 소스 주석 참조.

저작자 표시 비영리
신고

; ex_2_6

(define zero (lambda (f) (lambda (x) x)))

(define (add-1 n)
  (lambda (f) (lambda (x) (f ((n f) x)))))

; one
;(add-1 zero)
;(lambda (f) (lambda (x) (f ((zero f) x))))
;;((zero f) x)
;;((lambda (x) x) x)
;;x
;(lambda (f) (lambda (x) (f x)))
(define one (lambda (f) (lambda (x) (f x))))

; two
;(add-1 one)
;(lambda (f) (lambda (x) (f ((one f) x))))
;((one f) x)
;(((lambda (a) (lambda (b) (a b))) f) x)
;((lambda (b) (f b)) x)
;(f x)
;(lambda (f) (lambda (x) (f (f x))))
(define two (lambda (f) (lambda (x) (f (f x)))))

; three
(define three (lambda (f) (lambda (x) (f (f (f x))))))

; add
;(define (add a b) (lambda (f) (lambda (x) ("?"))))
;suppose a = 3, b = 3
;("?")
;(fa (fa (fa (fb (fb (fb x))))))
;(fa (fa (fa ((b f) x))))
;((a f) ((b f) x))

(define (add a b)
  (lambda (f)
    (lambda (x)
      ((a f) ((b f) x)))))
신고

; ex 2.4

; ex 2.5

(define (power x n)
  (define (power-iter r c)
    (if (= c 0)
        r
        (power-iter (* r x) (- c 1))))
  (power-iter 1 n))

(define (cons a b)
  (lambda (m) (m a b)))

(define (car z)
  (z (lambda (p q) (power 2 p))))

(define (cdr z)
  (z (lambda (p q) (power 3 q))))
신고

2.1.3

Announce/Chapter.2 2011.01.05 22:30
; 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))
신고

; 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)))
신고

2.1.2

Announce/Chapter.2 2011.01.01 11:07
...
신고

; ex_2_1

(define (make-rat3 n d)
  (let ((g ((if (< d 0) - +) (gcd n d))))
    (cons (/ n g) (/ d g))))
신고

2.1.1

Announce/Chapter.2 2011.01.01 11:05
; 2.1.1

; operation
(define (add-rat x y)
  (make-rat (+ (* (numer x) (denom y))
               (* (numer y) (denom x)))
            (* (denom x) (denom y))))
(define (sub-rat x y)
  (make-rat (- (* (numer x) (denom y))
               (* (numer y) (denom x)))
            (* (denom x) (denom y))))
(define (mul-rat x y)
  (make-rat (* (numer x) (numer y))
            (* (denom x) (denom y))))
(define (div-rat x y)
  (make-rat (* (numer x) (denom y))
            (* (numer y) (denom x))))
(define (equal-rat? x y)
  (= (* (numer x) (denom y))
     (* (numer y) (denom x))))

; constructor, selector
(define (make-rat n d) (cons n d))
(define (numer x) (car x))
(define (denom x) (cdr x))

(define (print-rat x)
  (newline)
  (display (numer x))
  (display "/")
  (display (denom x)))

(define (make-rat2 n d)
  (let ((g (gcd n d)))
    (cons (/ n g) (/ d g))))
신고

티스토리 툴바