예전에 메일을 하나 받았습니다.

Scheme 문제를 풀어달라는 문제였습니다.

그 때 여유가 조금 있어 문제를 풀어보어 블로그에 올렸습니다.

'부탁받은 Scheme 문제 001'

 

그런데 그 뒤에 답장으로 또 다른 세 문제를 보내왔습니다.

솔직하게 말하자면 짜증이 났습니다.

그 이유는 문제를 그대로 옮겨서 보냈기 때문입니다.

'내가 이렇게 풀어보았지만 어느 부분이 모르겠다. 도움을 요청한다.'라는 식의 메일은

이건 해당 문제를 두고 저와 토론하겠다는 뜻이니

서로에게 정보를 주고받으면서 같이 성장하는 느낌입니다.

하지만 문제만 달랑 보내주면

'문제 풀기 귀찮으니 너가 풀어봐라'라고 얘기하는 듯싶었습니다.

그래서 '그럼 돈을 보내라!'라고 답장을 적을 뻔했습니다.;;;

 

거기에 문제를 보니 SICP를 교재로 쓰는 듯 싶었습니다.

SICP를 배우는 그런 좋은 환경에 있으면서 저한테 염장질 하는건지...

좋은 환경이면 뭐합니까. 공부 하기 싶으면 그만이죠.;;;;

 

하지만 제가 남을 가르칠 정도의 경험이나 권리가 없다고 생각하여 보내지 않았습니다.

그리고 메일에 '시간 있으시면 좀 봐주세요.'라는 문구가 있어

'그래. 시간 생기는 방학 때 해주지.'라 생각하여 받은메일함에 그대로 두었습니다.

 

 

이제 방학이 되었습니다.

사실 오늘부터 SICP를 진행하려고 하였지만,

몇 달의 공백 덕분에 기억이 잘 나지 않았습니다.

그리고 이번 주 수요일부터 다음 주 월요일까지 집에 내려가기에

그 동안 SICP를 진행하지 못합니다.

그럼 이틀동안 기억을 되살려도 다시 까먹겠더군요.

따라서 다녀온 후에 진행하기로 했습니다.

다만, 전에 했던 약속도 있고 Warming up으로 문제를 풀어보기로 했습니다.

 

총 세 문제를 받았지만 그 중 마지막 문제는 허프만 코드에 대한 얘기입니다.

이는 후에 SICP를 모두 풀어본 후에 디저트로 한 번 해봐야겠습니다.^^

 

 

그리고 그 사이에 DrScheme가 Update가 되었습니다.

Version 4.0.0이 나왔더군요.

아니.. 정확하게는 4.01이 나왔습니다.

4.0.0을 설치하고나서 업데이트를 확인하니 4.0.1이 나왔다고 하더군요.;;;;

그래서 바로 업데이트 하였습니다.

 

몇 가지가 바뀌었습니다.

인터페이스도 조금 바뀌었습니다.

제일 특이한 것은 위처럼 Debug시 오른쪽에 창이 나타난 것입니다.

그래서 Debug 중 Stack과 Variables를 즉시 확인할 수 있습니다.

물론 전에도 해당 변수 위에 마우스 포인터를 올리고 마우스 오른쪽 버튼을 클릭하면

실행창에 해당 변수의 값을 출력할 수 있어 확인할 수 있었습니다.

하지만 이제는 즉시 여러 변수들이 변하는 것을 손쉽게 확인할 수 있습니다.^^

 

 

이제 본격적으로 해당 문제 풀이를 들어가겠습니다.

Problem 1. Add an additional operation to your create-pair procedure:

'other

Returns a procedure that accepts a procedure as its argument and

evaluates that procedure for input x and y.

Usage example:

(define myPair (create-pair 14 9))

((myPair 'other) <) => #f

;; (myPair 'other) returns a procedure that accepts one procedure as its

;; argument.

;; When that procedure is called with <, it performed the operation (< 14 9)

 

(define (create-pair x y)
  (define (dispatch op)
    (cond ((eq? op 'get-x) x)
          ((eq? op 'get-y) y)
          ((eq? op 'pair) (cons x y))
          ((eq? op 'sum) (+ x y))
          ((eq? op 'product) (* x y))
          ((eq? op 'max) (max x y))
          ((eq? op 'min) (min x y))
          (else
           (error "Unknown op -- CREATE-PAIR" op))))
  dispatch)

(define myPair (create-pair 14 9))
(myPair 'pair)
(myPair 'get-x)
(myPair 'get-y)
(myPair 'sum)
(myPair 'product)
(myPair 'max)
(myPair 'min)

(< 14 9)

((myPair 'other) >)
((myPair 'other) (lambda (x y) (/ (+ x y) 2)))

 

myPair라는 프로시저를 만들었습니다.

이것은 create-pair를 호출합니다.

create-pair는 인자로 둘을 저장하는 프로시저입니다.

따라서 (myPair 'pair)라고 하면 create-pair 프로시저의 op에 'pair가 들어갑니다.

여기서 'other를 받아 처리하는 코드를 추가하라고 하는군요.

'other는 프로시저를 인자로 받기에 lambda 표현을 썼습니다.

잘 되는군요.^^

 

(define (create-pair x y)
  (define (dispatch op)
    (cond ((eq? op 'get-x) x)
          ((eq? op 'get-y) y)
          ((eq? op 'pair) (cons x y))
          ((eq? op 'sum) (+ x y))
          ((eq? op 'product) (* x y))
          ((eq? op 'max) (max x y))
          ((eq? op 'min) (min x y))
          ((eq? op 'other) (lambda (rest_op) (rest_op x y))) ; answer
          (else
           (error "Unknown op -- CREATE-PAIR" op))))
  dispatch)

(define myPair (create-pair 14 9))
(myPair 'pair)
(myPair 'get-x)
(myPair 'get-y)
(myPair 'sum)
(myPair 'product)
(myPair 'max)
(myPair 'min)

(< 14 9)

((myPair 'other) >)
((myPair 'other) (lambda (x y) (/ (+ x y) 2)))

; add execute to check the answer
(define myPair (create-pair 20 30))
((myPair 'other) >)
((myPair 'other) (lambda (x y) (/ (+ x y) 2)))

크리에이티브 커먼즈 라이선스
Creative Commons License

글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.

트랙백 주소 :: http://nosyu.pe.kr/trackback/1550

댓글을 달아 주세요

[로그인][오픈아이디란?]