이 문제는 1.1.3절에서 계산 방식을 얘기할 때
전체 식의 부분 식을 먼저 계산한다고 하였습니다.
하지만 부분 식이 여럿일 경우 어느 것부터 먼저 하는지 말하지 않았다고 합니다.
따라서 (+ (f 0) (f 1))을 실행시켜
만약 왼쪽에서 오른쪽이라면 0이, 오른쪽에서 왼쪽이라면 1이 나오도록
프로시저 f를 만드는 문제입니다.

답은 왼쪽에서 오른쪽이네요.
(+ (f 0) (f 1))을 실행시키면 0이
(+ (f 1) (f 0))을 실행시키면 1이 나오기 때문입니다.
이 문제를 풀 때 고민 많이 했습니다.
처음에는 상당히 복잡하게 알고리즘을 생각했습니다.
하지만 그것은 그리 아름답지 못해서 깔끔하게 처리되는 것이 있으리라 생각했습니다.
이리저리 돌려보고 생각을 여러 번 하여 간신히 저런식으로 만들었습니다.
그렇지만 지금도 그리 깔끔하지 못하다고 생각합니다.
이보다 더 깔끔한 방법.. 없을까요?;;
참조
해럴드 애빌슨, 김재우 역, <컴퓨터 프로그램의 구조와 해석>, 인사이트, 2007, pp. 309
PS
SICP 주석 12번(311쪽)에 이런 말이 있습니다.
'그런 차례는 실행기나 번역기에 따라 (즉, 언어를 어떻게 구현하느냐에 따라)
얼마든지 바뀔 수 있다고 보는 게 맞다.
그러므로 어느 한 가지 차례만 따라서 프로그램을 짜는 것은 옳지 않다.
프로그램 성능을 끌어올리려고 부분 식의 계산 차례를
제맘대로 바꾸는 똑똑한 번역기도 있을 수 있다.'
따라서 다른 실행기에서는 어떻게 작동하는지 알아보았습니다.
제가 살펴본 것은 guile와 GIMP Script-Fu입니다.

guile

GIMP Script-Fu
두 개 모두 제가 제대로 쓸 줄 모르기에 저와 같이 하였습니다.
결과는 PLT-Scheme와 같습니다.
다른 결과를 내는 것을 찾고 싶었으나 후에 여러 실행기를 접하게 되면 해봐야겠습니다.
; answer
(define state 1)
(define (f x)
(if (= 1 state)
(begin (set! state 0) x)
(* x state)))
; execute
(+ (f 0) (f 1))
(define state 1)
(+ (f 1) (f 0))
- SICP Exercise 연습문제 3.11 (0)2008/03/09
- SICP Exercise 연습문제 3.10 (0)2008/03/09
- SICP Exercise 연습문제 3.9 (0)2008/03/08
- SICP Exercise 연습문제 3.8 (2)2008/03/08
- SICP Exercise 연습문제 3.7 (0)2008/03/08
- SICP Exercise 연습문제 3.6 (0)2008/03/08
- SICP Exercise 연습문제 3.5 (0)2008/03/08
글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.







댓글을 달아 주세요
김프 script-fu 콘솔을 이렇게 오용(!)하시다니!!!
감사합니다? 사실 아무도 안 쓰는 거니까.. 그렇게라도 ;;;
/Mr.Dust/
생각나는 것이 저것밖에 없었어요.ㅜㅜ
그런데 이 글은 적고나서 수정으로 해당 부분을 추가하였는데, 어떻게 아셨는지...;;;;