Racket으로 SICP 공부하기

약간만 구글링하면 금방 알 수 있는 바와 같이, SICP도 프로그래밍 능력을 한단계 업그레이드할 수 있는 좋은 책이고 clojure도 최근 함수형 언어 중에서 주목받고 있는 언어이다. 다만 SICP를 공부하려면 scheme이라는 lisp의 한 갈래인 언어로 익혀야 하는데, scheme 보다는 clojure를 공부하고 싶어서 이왕에 두 마리 토끼를 잡는다는 생각으로 clojure로 SICP 공부를 하고 있었다.

하면서 보니 이 방법에 몇몇 문제점이 있다는 것을 알았는데, 하나는 SICP 책을 보면서 머리 속에서 scheme과 clojure 사이에 변환을 해야 하다보니 진도가 잘 나가지 않는다는 점이고, 다른 하나는 new-if 예제나 tail-recursive 예제처럼 scheme과 clojure의 차이 때문에 clojure로 코드를 바꿀 때 clojure의 특성을 같이 고려해서 반영해줘야 하는 점이 있었다.

그래서 scheme을 통해 책을 먼저 훑어보고 그 후 clojure를 통해 연습문제를 푸는 방법이 좋을 것 같다. SICP의 scheme 코드를 실행해보기 위해서는 racket과 그 개발환경인 DrRacket이 딱 안성맞춤이라고 생각한다.

racket은 Mac OS X, Linux, Windows 등을 지원하므로 다운로드 및 설치는 홈페이지를 참고하면 되고, 설치 후 몇 가지 환경 설정을 해주어야 할 것들이 있다. 여기에 대해서는 Reeseo.net Wiki에서 다음과 같은 항목들에 대해 자세히 다루고 있으므로 링크 내용을 참고하면 된다.

  • Racket용 SICP 명세 모듈 설치
  • SICP 명세를 기본값으로 설정
  • 출력 스타일 수정

디버깅도 가능해서, 각 구문을 단계적으로 진행해가면서 구문의 반환값을 확인할 수 있으며, 스택 내용도 볼 수 있다.

SICP 1.2.2 절의 피보나치 수열의 tree recursion에 있는 재귀 버전 코드나 반복 버전 코드를 입력한 후 실행한 다음, 디버그 버튼을 누르면 디버깅을 위한 요소를 볼 수 있다. 특히 스택 내용을 보면 재귀와 반복 버전 간의 차이를 쉽게 알 수 있을 것이다.