<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Sicp on philipjkim</title><link>https://philipjkim.cc/tags/sicp/</link><description>Recent content in Sicp on philipjkim</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Tue, 25 Aug 2026 12:06:58 +0900</lastBuildDate><atom:link href="https://philipjkim.cc/tags/sicp/index.xml" rel="self" type="application/rss+xml"/><item><title>Go 로 읽는 SICP Part 14: 한 줄이 만드는 상수 공간, 그리고 4.2배 빠른 컴파일러</title><link>https://philipjkim.cc/posts/20260825-sicp-in-go-14/</link><pubDate>Tue, 25 Aug 2026 12:06:58 +0900</pubDate><guid>https://philipjkim.cc/posts/20260825-sicp-in-go-14/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;시리즈의 마지막 편입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260825-sicp-in-go-13/"&gt;Part 13&lt;/a&gt;에서 레지스터 머신을 만들고, &lt;code&gt;save&lt;/code&gt;/&lt;code&gt;restore&lt;/code&gt; 로 재귀를 구현하고, 반복 기계는 push 를 한 번도 안 한다는 것을 확인했습니다.&lt;/p&gt;
&lt;p&gt;이번 편은 그 위에 두 가지를 올립니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.4 명시적 제어 평가기&lt;/strong&gt; 는 4장의 평가기를 레지스터와 명시적 스택으로 다시 만듭니다. 그러면 시리즈 내내 미룬 꼬리 호출 문제가 &lt;strong&gt;코드 한 줄&lt;/strong&gt; 로 해결됩니다. 실제로 그 한 줄을 빠뜨렸다가 다시 찾았고, 그 과정을 숫자와 함께 싣습니다.&lt;/p&gt;</description></item><item><title>Go 로 읽는 SICP Part 13: 기계 수준에서 갚는 꼬리 호출의 빚</title><link>https://philipjkim.cc/posts/20260825-sicp-in-go-13/</link><pubDate>Tue, 25 Aug 2026 12:00:41 +0900</pubDate><guid>https://philipjkim.cc/posts/20260825-sicp-in-go-13/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260825-sicp-in-go-12/"&gt;Part 12&lt;/a&gt;로 4장을 끝냈습니다. 인터프리터를 네 개 만들었고, 그때마다 같은 문제가 돌아왔습니다. &lt;strong&gt;꼬리 호출을 어떻게 상수 공간으로 만드는가.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;5장이 그 질문에 답합니다. 방법은 &lt;strong&gt;더 내려가는 것&lt;/strong&gt; 입니다.&lt;/p&gt;
&lt;p&gt;지금까지 만든 평가기는 전부 Go 라는 고수준 언어 위에 있었습니다. 재귀는 Go 의 함수 호출이었고, 스택은 Go 의 스택이었습니다. 5장은 그 아래로 내려갑니다. &lt;strong&gt;레지스터 몇 개와 명령어 대여섯 개만 있는 기계&lt;/strong&gt; 를 만들고, 그 위에서 모든 것을 다시 구현합니다.&lt;/p&gt;</description></item><item><title>Go 로 읽는 SICP Part 12: call/cc 없이 시간 되감기 — amb 평가기</title><link>https://philipjkim.cc/posts/20260825-sicp-in-go-12/</link><pubDate>Tue, 25 Aug 2026 11:55:14 +0900</pubDate><guid>https://philipjkim.cc/posts/20260825-sicp-in-go-12/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260825-sicp-in-go-11/"&gt;Part 11&lt;/a&gt;에서 평가기를 빠르게 만들고 게으르게 만들었습니다. 이번 편은 &lt;strong&gt;아무 값이나 고르게&lt;/strong&gt; 만듭니다.&lt;/p&gt;
&lt;p&gt;4.3 절이 도입하는 것은 &lt;code&gt;amb&lt;/code&gt; 하나입니다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-scheme" data-lang="scheme"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;amb&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;이 식의 값은 1이거나 2이거나 3입니다. 어느 것인지는 정해지지 않습니다. 그리고 이 값을 쓴 계산이 나중에 &lt;strong&gt;모순에 부딪히면, 시간이 되감겨서&lt;/strong&gt; 다른 값으로 다시 시도합니다.&lt;/p&gt;
&lt;p&gt;즉 &lt;strong&gt;백트래킹이 언어 기능이 됩니다.&lt;/strong&gt; 프로그래머는 &amp;ldquo;무엇을 원하는가&amp;rdquo; 만 적고, &amp;ldquo;어떻게 찾는가&amp;rdquo; 는 평가기가 합니다.&lt;/p&gt;</description></item><item><title>Go 로 읽는 SICP Part 11: 1.74배 빨라지고 꼬리 호출을 잃다</title><link>https://philipjkim.cc/posts/20260825-sicp-in-go-11/</link><pubDate>Tue, 25 Aug 2026 11:50:41 +0900</pubDate><guid>https://philipjkim.cc/posts/20260825-sicp-in-go-11/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260825-sicp-in-go-10/"&gt;Part 10&lt;/a&gt;에서 Go 로 Scheme 인터프리터를 만들었습니다. 렉서, 파서, 환경, &lt;code&gt;eval&lt;/code&gt;/&lt;code&gt;apply&lt;/code&gt; 까지 649줄이었고, 실제로 &lt;code&gt;factorial(20)&lt;/code&gt; 과 3장의 계좌 객체를 돌렸습니다.&lt;/p&gt;
&lt;p&gt;이번 편은 그 평가기를 두 방향으로 고칩니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;앞쪽(4.1.7)은 빠르게 만듭니다.&lt;/strong&gt; 그리고 &lt;strong&gt;얼마나 빨라지는지, 대신 무엇을 잃는지&lt;/strong&gt; 를 실측합니다. 잃는 것이 있다는 게 이번 편의 발견입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;뒤쪽(4.2)은 게으르게 만듭니다.&lt;/strong&gt; 인자를 부를 때가 아니라 쓸 때 계산하도록 바꿉니다. 고칠 곳이 놀랍도록 적고, 그러고 나면 Part 9 의 스트림이 &lt;strong&gt;언어 기능으로 공짜로 딸려 옵니다.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Go 로 읽는 SICP Part 10: Go 로 Scheme 인터프리터 만들기 — 파서라는 청구서</title><link>https://philipjkim.cc/posts/20260825-sicp-in-go-10/</link><pubDate>Tue, 25 Aug 2026 11:44:05 +0900</pubDate><guid>https://philipjkim.cc/posts/20260825-sicp-in-go-10/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260825-sicp-in-go-09/"&gt;Part 9&lt;/a&gt;로 3장을 끝냈습니다. 이제 이 책의 정점인 &lt;strong&gt;4장&lt;/strong&gt; 입니다.&lt;/p&gt;
&lt;p&gt;4장이 하는 일은 한 문장으로 요약됩니다. &lt;strong&gt;언어를 직접 만듭니다.&lt;/strong&gt; 원서는 Scheme 으로 Scheme 인터프리터를 쓰고, 그래서 &lt;strong&gt;메타순환(metacircular) 평가기&lt;/strong&gt; 라고 부릅니다. 평가되는 언어와 평가하는 언어가 같기 때문입니다.&lt;/p&gt;
&lt;p&gt;Go 로 하면 메타순환이 아닙니다. Go 로 Scheme 을 만드는 것이니 그냥 인터프리터입니다. 그리고 그 차이 때문에 &lt;strong&gt;Part 1 과 Part 5 에서 예고한 마찰의 청구서가 여기서 도착합니다.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Go 로 읽는 SICP Part 9: 채널은 SICP 스트림이 아니다</title><link>https://philipjkim.cc/posts/20260825-sicp-in-go-09/</link><pubDate>Tue, 25 Aug 2026 11:38:44 +0900</pubDate><guid>https://philipjkim.cc/posts/20260825-sicp-in-go-09/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260825-sicp-in-go-08/"&gt;Part 8&lt;/a&gt;에서 3.3 까지 왔습니다. 이번 편은 3장의 마지막 두 절인 &lt;strong&gt;3.4 동시성&lt;/strong&gt; 과 &lt;strong&gt;3.5 스트림&lt;/strong&gt; 입니다.&lt;/p&gt;
&lt;p&gt;두 절의 성격이 정반대입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.4 는 Go 가 원서를 넘어서는 대목입니다.&lt;/strong&gt; 원서는 1996년 Scheme 으로 동시성을 다뤄야 했고, 표준 Scheme 에는 스레드가 없습니다. 그래서 대부분 그림과 사고 실험으로 설명합니다. Go 에서는 &lt;strong&gt;실제로 돌리고 실제로 깨뜨릴 수 있습니다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.5 는 반대입니다.&lt;/strong&gt; Go 에는 채널과 &lt;code&gt;iter.Seq&lt;/code&gt; 가 있고, 둘 다 SICP 스트림처럼 보입니다. &lt;strong&gt;그런데 아닙니다.&lt;/strong&gt; 이 차이를 모르고 옮기면 조용히 틀린 프로그램이 됩니다. 이번 편의 제목이 그 이야기입니다.&lt;/p&gt;</description></item><item><title>Go 로 읽는 SICP Part 8: 같은 pair 세 개를 세는 네 가지 답, 그리고 이벤트 루프</title><link>https://philipjkim.cc/posts/20260825-sicp-in-go-08/</link><pubDate>Tue, 25 Aug 2026 11:33:26 +0900</pubDate><guid>https://philipjkim.cc/posts/20260825-sicp-in-go-08/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260825-sicp-in-go-07/"&gt;Part 7&lt;/a&gt;에서 대입을 도입했습니다. &lt;strong&gt;프로시저&lt;/strong&gt; 가 상태를 가질 수 있게 되었습니다.&lt;/p&gt;
&lt;p&gt;3.3 은 같은 일을 &lt;strong&gt;데이터&lt;/strong&gt; 에 합니다. pair 의 car 와 cdr 를 나중에 바꿀 수 있게 하는 것입니다. Scheme 에서는 &lt;code&gt;set-car!&lt;/code&gt; 와 &lt;code&gt;set-cdr!&lt;/code&gt; 라는 새 연산이 필요하지만, &lt;strong&gt;Go 에서는 이미 되어 있습니다.&lt;/strong&gt; Part 4 에서 &lt;code&gt;Pair&lt;/code&gt; 를 구조체로 만들었으니 필드에 그냥 대입하면 됩니다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Pair&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Cdr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;any&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Car&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;something&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 이게 set-car!&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;기능이 공짜로 생겼다고 좋은 게 아닙니다. &lt;strong&gt;공짜로 생긴 만큼 대가도 조용히 따라옵니다.&lt;/strong&gt; 이번 편의 전반부가 그 대가에 관한 것입니다.&lt;/p&gt;</description></item><item><title>Go 로 읽는 SICP Part 7: 시간이 들어오면 치환 모델이 무너진다</title><link>https://philipjkim.cc/posts/20260825-sicp-in-go-07/</link><pubDate>Tue, 25 Aug 2026 11:28:58 +0900</pubDate><guid>https://philipjkim.cc/posts/20260825-sicp-in-go-07/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260825-sicp-in-go-06/"&gt;Part 6&lt;/a&gt;까지 2장을 끝냈습니다. 1장과 2장이 만든 세계에는 &lt;strong&gt;시간이 없었습니다.&lt;/strong&gt; 같은 인자를 넣으면 언제나 같은 답이 나왔고, 그래서 프로그램을 수식처럼 다룰 수 있었습니다.&lt;/p&gt;
&lt;p&gt;3장은 그 세계를 깹니다. 제목은 &lt;em&gt;Modularity, Objects, and State&lt;/em&gt; 이고, 첫 도구는 &lt;strong&gt;대입&lt;/strong&gt; 입니다.&lt;/p&gt;
&lt;p&gt;원서가 대입을 다루는 방식이 이 책답습니다. 대입을 소개하는 절(3.1.1) 다음에 &lt;strong&gt;&amp;ldquo;대입을 도입해서 얻는 것&amp;rdquo;(3.1.2)&lt;/strong&gt; 을 놓고, 바로 이어서 &lt;strong&gt;&amp;ldquo;대입을 도입해서 잃는 것&amp;rdquo;(3.1.3)&lt;/strong&gt; 을 놓습니다. 절 하나를 통째로 써서 자기가 방금 준 도구의 대가를 계산합니다.&lt;/p&gt;</description></item><item><title>Go 로 읽는 SICP Part 6: 1985년에 쓰인 Go 인터페이스 설계 지침</title><link>https://philipjkim.cc/posts/20260825-sicp-in-go-06/</link><pubDate>Tue, 25 Aug 2026 11:24:14 +0900</pubDate><guid>https://philipjkim.cc/posts/20260825-sicp-in-go-06/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260825-sicp-in-go-05/"&gt;Part 5&lt;/a&gt;까지 2장의 앞 세 절을 봤습니다. 이번 편은 2장의 마지막인 &lt;strong&gt;2.4 여러 표현&lt;/strong&gt; 과 &lt;strong&gt;2.5 제네릭 연산 시스템&lt;/strong&gt; 입니다.&lt;/p&gt;
&lt;p&gt;이 시리즈에서 &lt;strong&gt;Go 와 궁합이 가장 좋은 대목&lt;/strong&gt; 입니다. 원서가 1985년에 &amp;ldquo;데이터 지향 프로그래밍&amp;rdquo; 이라고 부른 것이, 지금 우리가 인터페이스 설계라고 부르는 것과 거의 같은 이야기이기 때문입니다.&lt;/p&gt;
&lt;p&gt;그런데 &amp;ldquo;거의&amp;rdquo; 입니다. 다른 부분이 오히려 더 재미있습니다. 원서는 세 가지 방식을 나란히 놓고 각각의 장단을 따지는데, &lt;strong&gt;Go 인터페이스는 그중 하나에 정확히 대응하고, 그 하나가 가진 약점을 그대로 물려받습니다.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Go 로 읽는 SICP Part 5: 파이프라인으로서의 프로그램, 그리고 quote 가 없는 언어</title><link>https://philipjkim.cc/posts/20260825-sicp-in-go-05/</link><pubDate>Tue, 25 Aug 2026 11:18:42 +0900</pubDate><guid>https://philipjkim.cc/posts/20260825-sicp-in-go-05/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260825-sicp-in-go-04/"&gt;Part 4&lt;/a&gt;에서 &lt;code&gt;Cons&lt;/code&gt;·&lt;code&gt;Car&lt;/code&gt;·&lt;code&gt;Cdr&lt;/code&gt; 세 개로 리스트와 트리를 만들었습니다. 이번 편은 그 위에서 두 가지를 합니다.&lt;/p&gt;
&lt;p&gt;앞쪽은 &lt;strong&gt;2.2.3 관례적 인터페이스&lt;/strong&gt; 입니다. &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt;, &lt;code&gt;accumulate&lt;/code&gt; 세 개로 프로그램의 모양을 바꾸는 이야기이고, 이 책에서 실무에 가장 직접적으로 쓸모 있는 절입니다. Go 1.23 이 &lt;code&gt;iter.Seq&lt;/code&gt; 를 넣은 이유와 정확히 같은 이야기이기도 합니다.&lt;/p&gt;
&lt;p&gt;뒤쪽은 &lt;strong&gt;2.3 기호 데이터&lt;/strong&gt; 입니다. 여기서 Part 1 에 예고한 마찰 두 번째 — Go 에는 &lt;code&gt;quote&lt;/code&gt; 가 없다 — 를 처음 만납니다.&lt;/p&gt;</description></item><item><title>Go 로 읽는 SICP Part 4: 데이터란 무엇인가 — 저장 공간 없는 pair</title><link>https://philipjkim.cc/posts/20260825-sicp-in-go-04/</link><pubDate>Tue, 25 Aug 2026 11:13:52 +0900</pubDate><guid>https://philipjkim.cc/posts/20260825-sicp-in-go-04/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260825-sicp-in-go-03/"&gt;Part 3&lt;/a&gt;까지 1장을 끝냈습니다. 1장이 조립한 것은 &lt;strong&gt;계산 방법&lt;/strong&gt; 이었습니다. 프로시저를 값으로 다루니 계산 방법 자체를 인자로 넘기고 반환할 수 있게 되었습니다.&lt;/p&gt;
&lt;p&gt;2장은 조립 대상을 바꿉니다. 이번에는 &lt;strong&gt;데이터&lt;/strong&gt; 입니다.&lt;/p&gt;
&lt;p&gt;그런데 2장을 읽다 보면 예상 못 한 질문 하나가 정면으로 나옵니다. 2.1.3 절의 제목이 &lt;em&gt;What Is Meant by Data?&lt;/em&gt; 입니다. 데이터가 뭐냐고 묻습니다. 이미 1장 내내 숫자를 다뤄 놓고 이제 와서 묻습니다.&lt;/p&gt;</description></item><item><title>Go 로 읽는 SICP Part 3: 함수를 돌려주는 함수, 그리고 제네릭이 필요해지는 순간</title><link>https://philipjkim.cc/posts/20260825-sicp-in-go-03/</link><pubDate>Tue, 25 Aug 2026 11:08:58 +0900</pubDate><guid>https://philipjkim.cc/posts/20260825-sicp-in-go-03/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260825-sicp-in-go-02/"&gt;Part 2&lt;/a&gt;에서 SICP 1.1~1.2 를 봤고, Go 에 꼬리 호출 최적화가 없어서 &amp;ldquo;재귀 프로시저 ≠ 재귀 프로세스&amp;rdquo; 라는 구분이 통째로 지워진다는 것을 실측으로 확인했습니다.&lt;/p&gt;
&lt;p&gt;이번 편은 1장의 마지막 절인 1.3, &lt;em&gt;Formulating Abstractions with Higher-Order Procedures&lt;/em&gt; 입니다. 프로시저를 &lt;strong&gt;인자로 받고 반환값으로 돌려주는&lt;/strong&gt; 이야기입니다.&lt;/p&gt;
&lt;p&gt;Go 는 함수가 일급 값입니다. 그러니 원서를 그대로 따라갈 수 있습니다. 그런데 그대로 따라가면 원서에 없던 것이 하나 붙습니다. &lt;strong&gt;타입&lt;/strong&gt; 입니다. 이게 이번 편에서 가장 흥미로운 지점입니다. 타입은 추상화의 계약을 눈에 보이게 만들어 주고, 동시에 원서에서는 공짜였던 어떤 코드를 &lt;strong&gt;컴파일 에러로&lt;/strong&gt; 만듭니다.&lt;/p&gt;</description></item><item><title>Go 로 읽는 SICP Part 2: 프로시저는 재귀인데 프로세스는 반복이다</title><link>https://philipjkim.cc/posts/20260825-sicp-in-go-02/</link><pubDate>Tue, 25 Aug 2026 11:03:29 +0900</pubDate><guid>https://philipjkim.cc/posts/20260825-sicp-in-go-02/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://philipjkim.cc/posts/20260825-sicp-in-go-01/"&gt;Part 1&lt;/a&gt;에서 책과 저자를 소개하고, Go 로 이 책을 읽을 때 부딪히는 마찰 세 곳을 예고했습니다. 이번 편에서 그중 첫 번째와 정면으로 만납니다.&lt;/p&gt;
&lt;p&gt;1장의 제목은 &lt;em&gt;Building Abstractions with Procedures&lt;/em&gt; 입니다. 다루는 내용은 두 덩어리입니다. 앞쪽(1.1)은 &lt;strong&gt;프로시저를 어떻게 만들고 이름 뒤에 감추는가&lt;/strong&gt;, 뒤쪽(1.2)은 &lt;strong&gt;그 프로시저가 실행될 때 어떤 모양의 프로세스가 생기는가&lt;/strong&gt; 입니다.&lt;/p&gt;
&lt;p&gt;이 두 번째가 이 책의 첫 번째 큰 아이디어입니다. 그리고 Go 로 옮기면 그 아이디어가 &lt;strong&gt;성립하지 않습니다.&lt;/strong&gt; 성립하지 않는 이유가 오히려 아이디어를 선명하게 만듭니다.&lt;/p&gt;</description></item><item><title>Go 로 읽는 SICP Part 1: 마법사 책은 왜 아직도 살아 있나</title><link>https://philipjkim.cc/posts/20260825-sicp-in-go-01/</link><pubDate>Tue, 25 Aug 2026 10:56:03 +0900</pubDate><guid>https://philipjkim.cc/posts/20260825-sicp-in-go-01/</guid><description>&lt;p&gt;&lt;em&gt;이 글은 Claude Opus 5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;프로그래밍 책의 유효기간은 보통 짧습니다. 5년이면 예제가 안 돌아가고, 10년이면 권하기가 민망해집니다.&lt;/p&gt;
&lt;p&gt;그런데 1984년에 초판이 나온 책 하나가 아직도 목록에 남아 있습니다. 표지에 마법사가 그려져 있어서 &amp;ldquo;마법사 책(Wizard Book)&amp;rdquo; 이라고 불리는 &lt;em&gt;Structure and Interpretation of Computer Programs&lt;/em&gt;, 줄여서 &lt;strong&gt;SICP&lt;/strong&gt; 입니다.&lt;/p&gt;
&lt;p&gt;이 시리즈는 SICP 를 &lt;strong&gt;Go 로&lt;/strong&gt; 다시 걸어 보는 14부작입니다. 원서는 Scheme 으로 쓰였고, 2022년에 나온 공식 JavaScript 판도 있습니다. 둘 다 훌륭한데, 둘 다 이 책이 요구하는 언어 기능을 &lt;strong&gt;이미 갖춘&lt;/strong&gt; 언어입니다. Go 는 그렇지 않습니다. 그래서 재미있습니다. 없는 기능을 손으로 만들어야 하는 지점마다, 원서가 무엇을 당연시하고 있었는지가 드러납니다.&lt;/p&gt;</description></item></channel></rss>