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

티스토리 툴바