정오표

『컴퓨터 프로그램의 구조와 해석』의 정오표입니다.

원서인 『Structure and Interpretation of Computer Programs』의 정오표는 여기입니다.

 

1권 : 목차 1.3절 쪽수 수정

64쪽 → 72쪽

 

3쇄 정오표

 

124쪽 첫 문단 1행~3행

실제로 기술자들은 측정불확도(measurement uncertainty)가 매우 적은 값을 다루기 때문에,

실제로 기술자들은 측정불확도measurement uncertainty[윗첨자, 폰트 확인]가 매우 적은 값을 다루기 때문에,

186쪽 각주 34번

(car (quote (a b c)) -> (car (quote (a b c)))

(list ‘(car (list ‘quote ‘(a b c))) -> (list ‘car (list ‘quote ‘(a b c)))

188쪽 각주 36번 첫 번째 문장 뒤 다음 구절 삽입

수를 글자(Symbol)로 보지는 않기 때문에

188쪽 2.3.2 연습 : 글자 식의 미분

역자이신 김재우 님께서 2.3.2 부분의 예제 코드를 보면서 문제점이 있다고 생각하셔서 아래와 같이 글을 덧붙이시고 수정된 scheme 파일도 올려주셨습니다. (첨부된 코드의 내용은 페이지를 따로 만들어 덧붙여두었습니다.)

  1. 책 본문에 나온 코드 보기에서 덧셈 식, 뺄셈 식에서 인자 식을 꺼내는 고르개 연산자들이 사람을 무척 헛갈리게 하다 보니, 연습하는 사람들 가운데, 책에서든 보기와 계산 값이 똑 같지 않다는 불평을 하는 사람들이 더러 있더군요. 계산 값이 달라지는 것은 아니지만, 처음 공부하는 사람들에게는 중요한 문제 같더군요.
  2. Number, variable을 abstraction을 하지 않고 쓴다는 것이 내내 마음에 걸렸는데 (붙박이 데이터라서 굳이 또 간추려 쓸 까닭이 없지만), 역시 ctor/selector/predicate라는 일관된 데이터 간추리기 실천 법을 따르지 않는다는 점이 가르침을 나누기는 걸리적 거립니다.

이런 까닭으로, 제가 살짝 고쳐쓴 scheme 파일(symdiff_-_final_-explicit_dispatch_on_types.ss)을 하나 덧붙입니다. SICP 정오표에 제 설명과 함께 덧붙여 주셔도 좋지 싶습니다.

208쪽 일곱째 줄

찾아내거나, 그런 레코드를 없을 때에는 –> 찾아내거나, 그런 레코드가 없을 때에는

213쪽 위에서 셋째 줄
뿌리에서 (첫 번째 비트가 1이므로 … 그 다음 두 번째 비트가 0이므로) …
–> 뿌리에서 (첫 번째 비트가 1이므로) … 그 다음 (두 번째 비트가 0이므로)

218쪽 연습문제 2.67 코드 들여쓰기 수정

(define sample-tree
  (make-code-tree (make-leaf 'A 4)
                  (make-code-tree; 이 뒤에 나오는 코드가 한 칸 (한 탭) 들여쓰기 되어야 합니다.
                    (make-leaf 'B 2)
                    (make-code-tree (make-leaf 'D 1)
                                    (make-leaf 'C 1)))))

241쪽 연습문제 2.74 두 번째 문단

아울러, 한 레코드는 또 다시 여러 정보의 (부서마다 구조가 다른) 집합으로 구성되는데, 주소나 봉급 같은 데이터가 열쇠가 되어 필요한 정보를 찾아보게 되어 있다. ->

아울러, 직원의 레코드는 하나 하나가 제 각기 (부서마다 구조가 다른) 정보들의 집합인데, address와 salary 같은 식별자(identifier)를 열쇠로 하는 정보를 포함하고 있다.

251쪽 밑에서 둘째 줄

우리는 줄곧 프로그램을 이는 부품 사이에 … 많은 노력을 기울였다. ->

주로, 프로그램을 부품별로 나누어 이해하고 개발할 수 있도록 하기 위해서 부품 사이에 경계를 짓는 일에 많은 노력을 기울였다.

257쪽 아래에서 다섯째 줄
그 연산을 적용할 수 있다고 본다. –> 그 연산을 적용할 수 있는지 본다.

263쪽 수식 위

이 다항식에서 x의 계수(곁수)는 y의 삼각 함수 다항식(여러 마디 세모꼴함수식, trigonometric function of polynomials)이고, y의 계수는 정수다. ->

이 다항식에서 x의 계수(곁수)는 y 다항식의 삼각 함수고, y의 계수는 정수다.

264쪽 각주 55번

어떤 점 집합에서 다항식의 값을 구하여 그 값으로 다항식을 나타낼 수 있는데, 이 표현 방식은 한 변수 다항식에 특히 잘 들어맞는다. ->

특히 한 변수 다항식에서,어떤 점 집합의 다항식의 값을 구하여 그 값으로 다항식을 나타내는 표현 방식이 좋다.

266쪽 install-polynomial-package 프로시저 코드 

<프로시저 same-variable?과 variable?은 2.3.2절에 나와 있다.>
–>  <2.3.2절에 정의된 same-variable? 프로시저>
<프로시저 adjoin-term … coeff의 정의는 아래에 나와 있다.>
–> <adjoin-term … coeff 프로시저>

268쪽 mul-term-by-all-terms 프로시저 코드

adjoin-term 이후 모든 코드를 딱 한 칸식 일제히 뒤로 밀어 쓰기

271쪽 59번 각주

허나, (add-term처럼) … 그런 걱정은 접어도 된다. 그런 뒷받침이 없다면 … ->

허나, (add-term처럼) adjoin-term을 써서 프로시저를 정의하는 경우, 언제나, 가장 차수가 높은 마디에다 adjoin-term을 적용한다는 사실만 뒷받침된다면 걱정할 게 없다. 다만 그런 뒷받침이 없다면 …

276쪽 맨 위

기약 분수가 나온다는 문제만 빼고, … 얻을 수 있다. ->

약분 문제만 아니면, 유리수 산술 꾸러미에서 일반화된 연산을 쓰도록 손보는 것만으로도 바라던 결과를 얻을 수 있다.

276쪽 60번 각주

측정값 -> 측도(測度, measure)

278쪽 61번 각주

MIT Scheme과 같은 구현에서는 … 경우가 많다. ->

MIT Scheme에서라면, Q1과 Q2의 약수, 곧 유리 계수(rational coefficient)를 가진 다항식이 나온다. 하지만 그 밖의 Scheme 시스템에서는 정수를 나누었을 때 정밀도가 제한된 소수(小數, decimal)가 나오는 게 대부분이라서 제대로 된 약수를 구하지 못할 수도 있다.

2쇄 정오표(3쇄에는 ‘188쪽 2.3.2 연습 : 글자 식의 미분’ 빼고 모두 반영)

 

48쪽 아래쪽 코드 1행 (임세영 님)

(define ((fib n)

(define (fib n)

 

67쪽 주석 47 2행 (김태연 님)

100,000,000 아래에는 25개가 있고 …

100,000,000 아래에는 255개가 있고 …

 

83쪽 아래쪽 코드 (NoSyu 님)

((lambda (<var¹> … <varⁿ>)

<body>)

<exp¹>)

<expⁿ>)

((lambda ( <var¹> … <varⁿ>)

<body>)

<exp¹>

<expⁿ>)

 

120쪽 연습문제 2.6 3행

0과 1을 다음과 같은 …

0과 더하기 1을 다음과 같은 …

 

124쪽 첫 문단 1행~3행

실제로 기술자들이 일을 할 때에는 정말 작은 값만 가지고 할 때가 많고,

흔히 그 부정확한 값을 구간의 가운데 점과 구간 값의 폭 비율로 측정한다.

실제로 기술자들은 측정불확도(measurement uncertainty)가 매우 적은 값을 다루기 때문에,

흔히 구간의 중점과 구간 값의 비율로 측정치를 나타내는 경우가 많다.

 

139쪽 연습문제 결과 (김태연 님)

5732188

57

321

88

 

188쪽 2.3.2 연습 : 글자 식의 미분
역자이신 김재우 님께서 2.3.2 부분의 예제 코드를 보면서 문제점이 있다고 생각하셔서 아래와 같이 글을 덧붙이시고 수정된 scheme 파일도 올려주셨습니다. (첨부된 코드의 내용은 페이지를 따로 만들어 덧붙여두었습니다.)
  1. 본문에 나온 코드 보기에서 덧셈 , 뺄셈 식에서 인자 식을 꺼내는 고르개 연산자들이 사람을 무척 헛갈리게 하다 보니, 연습하는 사람들 가운데, 책에서든 보기와 계산 값이 같지 않다는 불평을 하는 사람들이 더러 있더군요. 계산 값이 달라지는 것은 아니지만, 처음 공부하는 사람들에게는 중요한 문제 같더군요.

  2. Number, variable abstraction 하지 않고 쓴다는 것이 내내 마음에 걸렸는데 (붙박이 데이터라서 굳이 간추려 까닭이 없지만), 역시 ctor/selector/predicate라는 일관된 데이터 간추리기 실천 법을 따르지 않는다는 점이 가르침을 나누기는 걸리적 거립니다.

이런 까닭으로, 제가 살짝 고쳐쓴 scheme 파일(symdiff_-_final_-explicit_dispatch_on_types.ss) 하나 덧붙입니다. SICP 정오표에 설명과 함께 덧붙여 주셔도 좋지 싶습니다.

 

742쪽 코드 아래에서 2행 (김기오 님)

((else

(else

 

1쇄 정오표 (2쇄에는 모두 반영되었습니다.)

 

34쪽 연습문제 1-8 (이병준 님 http://www.buggymind.com/72)

(x + y^2 + 2y) / 3

( (x / y^2) + 2y) / 3

 

47쪽 연습문제 1-9 (1쇄 역주 추가)

(define (+ a b)

(if (= a 0)

b

(inc (+ (dec a) b))))

(역주) 이 부분을 실제 실행해보면 무한루프가 발생한다. + 연산이 정의되지 않았다는 가정 하에 이해를 돕기 위해 저자가 일부러 그렇게 했기 때문이다.

 

54쪽 연습문제 1-11 (이병준 님 http://www.buggymind.com/73)

f(n)=(n-1)+2f(n-2)+3f(n-3)

f(n)=f(n-1)+2f(n-2)+3f(n-3)

 

59쪽 연습문제 1.16 2행 (NoSyu 님)
  되풀이 프로세스

반복 프로세스

 

62쪽 7행 (NoSyu 님)
이 알고리즘은, a를 b로 나눈 나머지가 r일 때 a와 b의 약수가 b와 r의 약수가…

이 알고리즘은, a를 b로 나눈 나머지가 r일 때 a와 b의 최대 공약수가 b와 r의 최대 공약수가…

 

63쪽 주석 밑에서 2행 (NoSyu 님)
b_{k+1} >= Fib(k-1)이고 b_k …

b_{k-1} >= Fib(k-1)이고 b_k …

 

65쪽 7행 (NoSyu 님)
find-divisor를 끝내는 조건은 (루트n)이 소수가 아니면 (루트 n)보다 작거나 같은…

find-divisor를 끝내는 조건은 n이 소수가 아니면 (루트 n)보다 작거나 같은…

 

78쪽 연습문제 1.31 2행 (심효섭 님)
sum을 흉내내어서 어떤 넓이 속에 있는 점(숫자)마다 함수 값을 구하고 …

sum과 비슷하게, 어떤 구간 속에 있는 점^(숫자)마다 정해진 함수의 값을 구하고, …

 

89쪽 본문 둘째 문단 2행 (배대연 님)
y3 = x / y2 = x / (x / x / y1)  = y1

y3 = x / y2 = x / (x / y1)  = y1

 

123쪽 연습문제 2.11 3행 (buff 님)
두 번 곱셈할 일은 한 번밖에 없다…

두 번 이상 곱셈할 일은 한 번밖에 없다…

 

144쪽 연습문제 2.29 1~2행 (comkid 님)
모든 가지는 길이가 같은 막대로 만들고, 막대에는 추가 달려 있거나 다른 두 팔 모빌이 붙어있다.

두 팔 모빌은 다음과 같이 가지(막대기) 두 개를 (여기서는, list를 써서) 합친 데이터로 나타낼 수 있다.

 

159쪽 연습문제 2.39 코드 4행 (NoSyu 님)
fold-left (lambda (x y) <??> <??>) nil sequence)

fold-left (lambda (x y) <??>) nil sequence)

 

176쪽 연습문제 2.46 2행 (NoSyu 님)
벡터를 짜맞추는 연산 make-rect와 벡터에서 좌표를 골라내는 연산…

벡터를 짜맞추는 연산 make-vect와 벡터에서 좌표를 골라내는 연산…

 

176쪽 연습문제 2.46 수식 마지막 행 (NoSyu 님)
s·(x, y) = (sx,,sy)

s·(x, y) = (sx,sy)

 

179쪽 둘째 코드 마지막 행 (NoSyu 님)
(make-vect 0.0 0.0)) ; edge2edge1의 새 끝점

(make-vect 0.0 0.0)) ; edge2의 새 끝점

 

190쪽 3~4행 (NoSyu 님)
예컨데, 덧셈 식이라면 더하임수addend(첫째 마디)나 덧수augend(둘째 마디)를 뽑아낼 수 있어야 한다.

예컨데, 덧셈 식이라면 더하임수augend(첫째 마디)나 덧수addend(둘째 마디)를 뽑아낼 수 있어야 한다.

 

196쪽 주석 37 4행(NoSyu 님)
어떤 집합 S T와 물체 x가 있다고 할 때, (element-of-set? (union-set S T))는 (or …

어떤 집합 S T와 물체 x가 있다고 할 때, (element-of-set? x (union-set S T))는 (or …

 

196쪽 주석 37 7행(NoSyu 님)
어떤 물체 x가 있다고 할 때, (element-of-set? ‘())

어떤 물체 x가 있다고 할 때, (element-of-set? x ‘())

 

200쪽 6행(NoSyu 님)
가장 작은 원소이기 때문에, x1이 set2의 원소가 아니어서 교집합 원소가 도지 못…

가장 작은 원소이기 때문에, x1이 set2의 원소가 아니어서 교집합 원소가 되지 못…

 

220쪽 연습문제 2.71 1행(NoSyu 님)
글자 n개를 위한 허프만 나무가 있고, 글자마다 빈도가 1, 2, 3,

글자 n개를 위한 허프만 나무가 있고, 글자마다 빈도가 1, 2, 4,

 

225쪽 둘째 문단 6행 (김남형 님)
기와 각도를 받아서 복소수를 만들어 내는 make-from-magnitude-angle이라고

기와 각도를 받아서 복소수를 만들어 내는 make-from-mag-ang라고

 

226쪽 아래쪽 공식 1행(NoSyu 님)
x = r cos A           r = √x² + y²

x = r cos A           r = √(x² + y²)

 

257쪽 12행 (NoSyu 님)
그 연산이 그 데이터 티입에 곧바로…

그 연산이 그 데이터 타입에 곧바로…

 

257쪽 그림 (김남형 님)
정수 → 유리수 → 상수 → 복소수

정수 → 유리수 → 실수 → 복소수

 

278쪽 마지막 문단 1행 (NoSyu 님)
더 정확하게 설명하면, P와 Q가 다항식이고 Q₁을 P의 차수(…), O₂를 Q의 차수라 하자. 또한 c가 Q₁의 첫 계수라 하자.

더 정확하게 설명하면, P와 Q가 다항식이고, O₁을 P의 차수(…), O₂를 Q의 차수라 하자. 또한 c가 Q의 첫 계수라 하자.

 

278쪽 마지막 행 (NoSyu 님)
그 나머지를 가짜 나머지pseudoremainder라고도 한다.

그 나머지를 가짜 나머지pseudoremainder라고도 한다.

 

371쪽 그림 3.28 가장 오른쪽 상자

a1 * a2 = s

a1 + a2 = s

372쪽 첫 번쩨 코드 3행 (김남형 님)

(celsius-fahrenheit-converter C F5)

(celsius-fahrenheit-converter C F)

 

376쪽 마지막 행 (NoSyu 님)

‘문법 인터페이스'(3.3.3절에서 주석 27을 보자)다.

‘문법 인터페이스'(3.3.4절에서 주석 27을 보자)다.

 

390쪽 그림 3.30 폴 바로 아래 동그라미 (김남형 님)

100

5

 

390쪽 그림 3.30 개인 계좌(Bank2) 바로 아래 동그라미

100

300

 

404쪽 주석 45 밑에서 2행 (NoSyu 님)

뮤텍스가 풀리면 막안놓던 프로세스를

뮤텍스가 풀리면 막아놓던 프로세스를

 

422쪽 첫째 코드 (NoSyu 님)

(memo-proc (lambda () <exp>)

(memo-proc (lambda () <exp>))

 

430쪽 연습문제 3.54 3~4행 (NoSyu 님)

(0에서) n번째 원소가 n+1 사다리곱factorial 스트림을 만들어 보라.

(0부터 헤아렸을 때) n번째 원소의 값이 n+1 사다리곱factorial이 되는 스트림을 만들어 보라.

 

431쪽 8행 (NoSyu 님)

(scale-stream S 3)과 (scale-stream 5 S)의 원소도 그러하다.

(scale-stream S 3)과 (scale-stream S 5)의 원소도 그러하다.

 

432쪽 1행 (NoSyu 님)

(define S (cons-stream 1 (merge <??>)))

(define S (cons-stream 1 (merge <??> <??>)))

 

437쪽 코드 1행 (NoSyu 님)

(defint (pi-summands n)

(define (pi-summands n)

 

444쪽 둘째 코드 마지막 행 (NoSyu 님)

(paris (stream-cdr s) (stream-cdr t)))))

(pairs (stream-cdr s) (stream-cdr t)))))

 

456쪽 연습문제 3.79 1행 (NoSyu 님)

쓰임새를 늘려서 d²y / df² = f(dy/dt, y) 꼴의…

쓰임새를 늘려서 d²y / dt² = f(dy/dt, y) 꼴의…

 

472쪽 셋째 문단 2행 (김기오 님)

비결정적 계산 방법nondeteministic computing …

비결정적 계산 방법nondeterministic computing …

 

490쪽 연습문제 4.8 바로 윗 문장 (김남형 님)

그게 아니라면, let*를 let에서 이끌어낸 식으로 처리하지 않고 별로도 처리하는 게 맞는가?

그게 아니라면, let*를 let에서 이끌어낸 식으로 처리하지 않고 별도로 처리하는 게 맞는가?

 

521쪽 역주 31 밑에서 2행 (김남형 님)
snarfdown : 주인 허락이 …

snarf down : 주인 허락이 …

 

523쪽 연습문제 4.26 5행 (김남형 님)

와 엮어 쓸 수 없는 프로시저가 …

와 엮어 쓸 수 있는 프로시저가 …

 

601쪽 셋째 문단 3행 (김남형 님)

보기를 들어, 패턴 (?x ?x)와 ((a ?y c) (ab ?z))를 동일화한다 치면, …

보기를 들어, 패턴 (?x ?x)와 ((a ?y c) (a b ?z))를 동일화한다 치면, …

 

611쪽 두 번째 문단 밑에서 3행 (김남형 님)

달리 말하자면 논리 프로그래밍 언어에서 not이라는 이른바 닫힌 …

달리 말하자면 논리 프로그래밍 언어에서 not 이른바 닫힌 …

 

614쪽 연습문제 4.69 6행 (김남형 님)

이를 가지고 ((great. ?rel) ?x ?y)라는 관계를 …

이를 가지고 ((great . ?rel) ?x ?y)라는 관계를 …

 

636쪽 1~2행 (김남형 님)

?symbol 같은 꼴로 식 속에 들어 있는 패턴 변수를 (?symbol) 꼴로 바꾸기 위해서

?symbol 같은 꼴로 식 속에 들어 있는 패턴 변수를 (? symbol) 꼴로 바꾸기 위해서

 

650쪽 밑에서 6행 (김남형 님)

화살표를 으로 보고, X 단추를 스위치로 …

화살표를 전선으로 보고, X 단추를 스위치로 …

 

671쪽 연습문제 5.6 1행 (김남형 님)
Ben Bitdiddle은 피보나치 기계 제어기가 save와 restore 명령을 처리한다는 …

Ben Bitdiddle은 피보나치 기계 제어기가 부차적인 save와 restore 명령을 처리한다는 …

 

674쪽 5.2.1 5행 (김남형 님)
make-new-machine으로 만든 기본적 모형에서 본질적으로 …

make-new-machine으로 만든 기본적 모형 본질적으로 …

 

677쪽 그림 5.13 9-10행 들여쓰기 (김남형 님)

(register-table)

(list (list ‘pc pc) (list ‘flag flag))))

(register-table)

(list (list ‘pc pc) (list ‘flag flag))))

679쪽 5.2.2 6행 (김남형 님)
명령의 실행시간 실행과 분석을 분리하여 …

명령의 실행 과정과 분석을 분리하여 …

 

684쪽 코드 8-10행 들여쓰기 (김남형 님)

(make-operation-exp
value-exp machine lables operations)
(make-primitive-exp
(car value-exp) machine labels))))

(make-operation-exp

value-exp machine lables operations)

(make-primitive-exp

(car value-exp) machine labels))))

 

692쪽 연습문제 5.11 b. 1-2행 (김남형 님)
b. (restore y)는 스택에 마지막으로 저장한 값을 y에 둔다. 오로지 y에 저장했다는 가정하에서다. 하지만 y에 저장한 값이 아니라면 잘못됐다고 나타낸다.

b. (restore y)는 스택에 마지막으로 저장한 값을 y에 둔다. 하지만 이것은 마지막으로 y 의 값을 스택에 저장한 경우에만 그러하며, 다른 레지스터가 y 다음에 스택에 값을 저장한 경우에는 잘못되었다고 알린다.

 

692쪽 연습문제 5.11 c. 1-2행 (김남형 님)

c. (restore y)는 y가 마지막으로 저장한 값을 y에 둔다. 다른 레지스터가 y 다음에 저장하고 꺼내지 않았다는 것은 개의치 않는다.

c. (restore y)는 마지막으로 저장한 y의 값을 y에 둔다. 다른 레지스터가 y 다음에 스택에 값을 저장하고 아직 꺼내지 않았더라도 개의치 않는다.

 

698쪽 4행 (김남형 님)
실행기 내부에서 필요한 데이터 들어간다.

실행기 내부에서 필요한 데이터 들어간다.

 

710쪽 코드 5행 (김남형 님)
(assign relocate-continue (label ressign-root))

(assign relocate-continue (label reassign-root))

 

742쪽 타깃과 연결 2행 (김남형 님)
타깃은 식을 번역한 값을 돌려 레지스터가 어떤 것인지 알려준다.

타깃은 식을 번역한 값을 돌려 레지스터가 어떤 것인지 알려준다.

 

743쪽 밑에서 둘째 문단 2행 (김남형 님)
복합 식 계산에서 부분 식을 계산해 전체 식을 전체 식을 계산했듯이,

복합 식 계산에서 부분 식을 계산해 전체 식을 계산했듯이,

 

757쪽 코드 7-10행 들여쓰기 (김남형 님)
(append-instruction-sequences
(car operand-codes)
(make-instruction-sequence ‘(val) ‘(argl)
‘((assign argl (op list) (reg val)))))))

(append-instruction_sequences
   (car operand-codes)
(make-instruction-sequence ‘(val) ‘(argl)
‘((assign argl (op list) (reg val)))))))

 

757쪽 코드 13-16행 들여쓰기기 (김남형 님)
(preserving ‘(env)
code-to-get-last-arg
(code-to-get-rest-args
(cdr operand-codes))))))))

(preserving ‘(env)
   code-to-get-last-arg
(code-to-get-rest-args
(cdr operand-codes))))))))

758쪽 코드 3-5행 들여쓰기 (김남형 님)
(preserving ‘(argl)
(car operand-codes)
(make-instruction-sequence ‘(val argl) ‘(argl)

    (preserving ‘(argl)
          (car operand-codes)
(make-instruction-sequence ‘(val argl) ‘(argl)

 

758쪽 코드 10-12행 들여쓰기 (김남형 님)
(preserving ‘(env)
code-for-next-arg
(code-to-get-rest-args (cdr operand-codes))))))

(preserving ‘(env)
    code-for-next-arg
(code-to-get-rest-args (cdr operand-codes))))))

 

784쪽 주석48 1행 (김남형 님)
번역된 프로시저 기본 프로시저가 아닌 복합 프로시저다.

번역된 프로시저 기본 프로시저가 아닌 복합 프로시저다.

 

 

One thought on “정오표

  1. 김현수

    정오표 중 “188쪽 2.3.2 연습 : 글자 식의 미분” 부분의 링크가 없어져서 다른 곳으로 연결됩니다.

Comments are closed.