<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Serendip &#187; sicp</title>
	<atom:link href="http://www.serendip.ws/archives/tag/sicp/feed" rel="self" type="application/rss+xml" />
	<link>http://www.serendip.ws</link>
	<description>Webデザイン・プログラミング</description>
	<lastBuildDate>Fri, 10 Feb 2012 05:33:58 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>SICP（計算機プログラムの構造と解釈）を読み終えて</title>
		<link>http://www.serendip.ws/archives/429</link>
		<comments>http://www.serendip.ws/archives/429#comments</comments>
		<pubDate>Wed, 30 Dec 2009 15:32:43 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[sicp]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=429</guid>
		<description><![CDATA[最後のC言語での実装の2問が残っているけれども、一旦これで終了とする。 2008年の11月に開始したので約1年と1ヶ月ちょっとかかったことになる。 計算機プログラムの構造と解釈 posted with amazlet a [...]]]></description>
			<content:encoded><![CDATA[<p>最後のC言語での実装の2問が残っているけれども、一旦これで終了とする。<br />
2008年の11月に開始したので約1年と1ヶ月ちょっとかかったことになる。</p>
<div class="amazlet-box" style="margin-bottom:0px;font-size:9pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51ZSMEJ9Y2L._SL160_.jpg" alt="計算機プログラムの構造と解釈" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-left:15px;margin-top:10px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">計算機プログラムの構造と解釈</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/489471163X/serendip7822-22/ref=nosim/" title="計算機プログラムの構造と解釈" target="_blank">amazlet</a> at 09.12.29</div>
</div>
<div class="amazlet-detail">ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン <br />ピアソンエデュケーション <br />売り上げランキング: 119177</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
<h3>SICP を読む過程で得たもの</h3>
<p>1章で scheme での基本的なプログラミングに慣れて、カッコの存在を忘れることが出来た。</p>
<blockquote><p>弟子が尋ねた。「先生、私は先生がカッコをまるで魔術師のように扱っているのを常々敬服しています。どうすれば先生のようになれるのでしょうか?」<br />
師「えっ?カッコ?あ、そうか。そんなものもあったな。いやあ、すっかり忘れておったわ」</p></blockquote>
<p>このあたりでは、まだ再帰に慣れていなくて、末尾再帰の意味もよく解ってなかった。<br />
また、高階手続きを普通に使えるようになった。</p>
<p>2章で抽象化の有用性やその導入方法を理解できた。<br />
1章2章は数学的な知識が必要な部分も多く、その部分で苦労した。</p>
<p>2章のデータ抽象や3章の環境モデルでオブジェクト指向の舞台裏を覗き、3章では遅延評価の一端に触れることができた。<br />
3章で初めて <code>set!</code> による代入が登場し、参照透明性の破れによる副作用を理解した。</p>
<p>4章でインタプリタを実装し、遅延評価や継続・論理型プログラミングを実装を通して理解できた。</p>
<p>5章でレジスタのしくみを理解して、インタプリタとコンパイラとの違いを理解できた。<br />
といっても、5章はかなりとばしていったので、ちゃんと理解したかというと・・・</p>
<h3>まとめ</h3>
<p>全てを読み終えてみると、章を追うごとに計算機プログラムのより低レベルの部分に降りていく感じがした。<br />
そういう意味では、1章から順に読み進めていかないと理解できなかったと思う。<br />
そして、1人で SICP を読むにはネットの情報なしには読めなかったと思う、ネットに記事を書いてくださった皆様、ありがとうございました。</p>
<p>SICP では scheme を使ったけれどもマクロなどは一切登場しなかったので、次は OnLisp で lisp のマクロについて勉強してみようかな。</p>
<div class="amazlet-box" style="margin-bottom:0px;font-size:9pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4274066371/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41Vx%2BOomN3L._SL160_.jpg" alt="On Lisp" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-left:15px;margin-top:10px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4274066371/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">On Lisp</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4274066371/serendip7822-22/ref=nosim/" title="On Lisp" target="_blank">amazlet</a> at 09.12.29</div>
</div>
<div class="amazlet-detail">ポール グレアム 野田 開 <br />オーム社 <br />売り上げランキング: 41558</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4274066371/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
<h3>参考にしたサイト集</h3>
<h4>SICP公式サイト</h4>
<dl>
<dt><a href="http://mitpress.mit.edu/sicp/" class="out">Welcome to the SICP Web Site</a></dt>
<dd>公式サイト</dd>
<dt><a href="http://sicp.ipl.t.u-tokyo.ac.jp/" class="out">SICP Web Site for the Japanese Edition</a></dt>
<dd>日本語版公式サイト</dd>
</dl>
<h4>SICP解答例</h4>
<dl>
<dt><a href="http://d.hatena.ne.jp/higepon/19700103/1145105233" class="out">SICP関数型言語の勉強に「計算機プログラムの構造と解釈」を読もう &#8211; ひげぽん OSとか作っちゃうかMona-</a></dt>
<dd>解答例あり</dd>
<dt><a href="http://oss.timedia.co.jp/show/SICP/Answer%20Book" class="out">『計算機プログラムの構造と解釈 第二版』解答集(未完) &#8211; Answer Book | SICP | OSS-Web</a></dt>
<dd>解答例あり</dd>
<dt><a href="http://www.csus4.net/hiki/SICPReading/" class="out">素人くさいSICP読書会 Wiki &#8211; SICP Reading&#8217;s Wiki</a></dt>
<dd>解答例あり</dd>
<dt><a href="http://www.mokehehe.com/assari/index.php?%B7%D7%BB%BB%B5%A1%A5%D7%A5%ED%A5%B0%A5%E9%A5%E0%A4%CE%B9%BD%C2%A4%A4%C8%B2%F2%BC%E1" class="out">計算機プログラムの構造と解釈 &#8211; assari</a></dt>
<dd>解答例あり</dd>
<dt><a href="http://d.hatena.ne.jp/tanakaBox/" class="out">ボクノス</a></dt>
<dd>解答例あり</dd>
<dt><a href="http://d.hatena.ne.jp/rsakamot/searchdiary?word=%2a%5bSICP%5d" class="out">[SICP] &#8211; さかもっちゃんちゃんこ</a></dt>
<dd>解答例あり</dd>
<dt><a href="http://himoiku.cocolog-nifty.com/blog/sicp/index.html" class="out">いろいろてｓｔ: SICP</a></dt>
<dd>解答例あり</dd>
<dt><a href="http://eli.thegreenplace.net/category/programming/lisp/sicp/" class="out">Eli Bendersky’s website » SICP</a></dt>
<dd>解答例あり</dd>
</dl>
<h4>SICP 関連記事</h4>
<dl>
<dt><a href="http://d.hatena.ne.jp/higepon/20061027/1161960363" class="out">「計算機プログラムの構造と解釈(SICP)」を読み終えて &#8211; ひげぽん OSとか作っちゃうかMona-</a></dt>
<dd>SICP 読後感</dd>
<dt><a href="http://natu.txt-nifty.com/natsutan/2007/09/sicp_by_a6a2.html" class="out">なつたん: 「計算機プログラムの構造と解釈(SICP)」を読み終えて by なつたん</a></dt>
<dd>SICP 読後感</dd>
<dt><a href="http://d.hatena.ne.jp/rsakamot/20090809/1249782989" class="out">SICP終了 &#8211; さかもっちゃんちゃんこ</a></dt>
<dd>SICP 読後感</dd>
<dt><a href="http://d.hatena.ne.jp/yad-EL/20080226/p1" class="out">本当のプログラミング初心者がSICPを読んではいけない三つの理由 &#8211; ヤドカリデンキ商会（第一倉庫）</a></dt>
<dd>その他</dd>
<dt><a href="http://0xcc.net/misc/sicp.html" class="out">『計算機プログラムの構造と解釈』について</a></dt>
<dd>その他</dd>
<dt><a href="http://blog.livedoor.jp/dankogai/archives/50489679.html" class="out">404 Blog Not Found:(いい本) &#8211; 書評 &#8211; 計算機プログラムの構造と解釈(SICP)</a></dt>
<dd>その他</dd>
<dt><a href="http://d.hatena.ne.jp/nowokay/20090321" class="out">いまSICPを読むのは時間の無駄 &#8211; きしだのはてな</a></dt>
<dd>その他</dd>
<dt><a href="http://d.hatena.ne.jp/nowokay/20090322/1237667055" class="out">SICPの価値 &#8211; きしだのはてな</a></dt>
<dd>その他</dd>
<dt><a href="http://d.hatena.ne.jp/takahashim/20090327/p1" class="out">「たしなみ」ではなく「たのしみ」としてのSICP &#8211; 思っているよりもずっとずっと人生は短い。</a></dt>
<dd>その他</dd>
<dt><a href="http://d.hatena.ne.jp/naruoga/20090321/1237657140" class="out">「計算機プログラムの構造と解釈」は読む価値がないか？ &#8211; なるひこの Linux Printing お勉強日記</a></dt>
<dd>その他</dd>
</dl>
<h4>Gauche 関連リンク集</h4>
<dl>
<dt><a href="http://practical-scheme.net/gauche/index-j.html" class="out">Gauche &#8211; A Scheme Interpreter</a></dt>
<dd>Gauche 公式サイト</dd>
<dt><a href="http://practical-scheme.net/gauche/man/gauche-refj.html" class="out">Gauche ユーザリファレンス: Top</a></dt>
<dd>Gauche のリファレンスマニュアル</dd>
<dt><a href="http://d.hatena.ne.jp/rui314/" class="out">Gaucheクックブック</a></dt>
<dd>Gauche の実用的な短いコードを提示。毎週月曜、木曜に更新</dd>
<dt><a href="http://karetta.jp/book-cover/gauche-hacks" class="out">Gaucheプログラミング(立読み版)</a></dt>
<dd>karetta.jpのWebBook</dd>
</dl>
<h4>その他</h4>
<dl>
<dt><a href="http://shibuya.lisp-users.org/" class="out">Shibuya.lisp</a></dt>
<dd>We love Lisp-based languages Common Lisp, Scheme, Arc and Clojure.</dd>
<dt><a href="http://pc11.2ch.net/test/read.cgi/tech/1203096230/" class="out">【SICP】計算機プログラムの構造と解釈 Part2</a></dt>
<dd>2ちゃんねる SICP スレッド</dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/429/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>問題5.50 &#8211; SICP（計算機プログラムの構造と解釈）その302</title>
		<link>http://www.serendip.ws/archives/4020</link>
		<comments>http://www.serendip.ws/archives/4020#comments</comments>
		<pubDate>Wed, 30 Dec 2009 05:33:01 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[sicp]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=4020</guid>
		<description><![CDATA[問題5.50 4.1節の超循環評価器を compile-and-go させる。 primitive-procedures に必要な手続きを追加していく。 また、let が定義されていなかったので基本手続きに let を追 [...]]]></description>
			<content:encoded><![CDATA[<h3>問題5.50</h3>
<p>4.1節の超循環評価器を <code>compile-and-go</code> させる。</p>
<p><code>primitive-procedures</code> に必要な手続きを追加していく。<br />
また、<code>let</code> が定義されていなかったので基本手続きに <code>let</code> を追加する。<br />
レジスタ計算機シミュレータの <code>make-new-machine</code> は性能監視機能を追加したものを使った。<br />
環境へ基本手続きを登録する際に <code>map</code> が上手く動作しなかったので &quot;<a href="http://himoiku.cocolog-nifty.com/blog/2008/07/sicp550_f385.html" class="out">いろいろてｓｔ: SICP問題5.50</a>&quot; を参考にして <code>map</code> を定義し <code>primitive-procedure-objects</code> を修正した。<br />
また、ece4compiler.scm の <code>compile-and-go</code> の <code>(eceval 'trace-on)</code> のコメントアウトを解除すると実行をトレースできる。</p>
<p>とりあえず、ちゃんと動作するようになったのでファイル(<a href="/resource/sicp-ex5.50.zip">sicp-ex5.50.zip</a>)をアップロードしておく。</p>
<p>実行結果</p>
<pre>$ gosh
gosh&gt; (load &quot;./compiled-eval.scm&quot;)

(total-pushes = 1669 max-depth = 123)
;;; EC-Eval value:
ok

;;; EC-Eval input:
(driver-loop)

;;; M-Eval input:
(define (factorial n)
  (if (= n 1)
      1
      (* (factorial (- n 1)) n)))

;;; M-Eval value:
ok

;;; M-Eval input:
(factorial 5)

;;; M-Eval value:
120
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:7pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51ZSMEJ9Y2L._SL160_.jpg" alt="計算機プログラムの構造と解釈" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-top:10px;margin-left:15px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">計算機プログラムの構造と解釈</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/489471163X/serendip7822-22/ref=nosim/" title="計算機プログラムの構造と解釈" target="_blank">amazlet</a> at 08.11.07</div>
</div>
<div class="amazlet-detail">ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン <br />ピアソンエデュケーション <br />売り上げランキング: 6542</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/4020/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>問題5.49 &#8211; SICP（計算機プログラムの構造と解釈）その301</title>
		<link>http://www.serendip.ws/archives/4005</link>
		<comments>http://www.serendip.ws/archives/4005#comments</comments>
		<pubDate>Tue, 29 Dec 2009 09:28:54 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[sicp]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=4005</guid>
		<description><![CDATA[問題5.49 式を &#34;読み込み(read-eval-print-loop)&#34;、それを&#34;翻訳(compile)&#34;し、結果のコードを&#34;アセンブリ(assemble)&#038;quot [...]]]></description>
			<content:encoded><![CDATA[<h3>問題5.49</h3>
<p>式を &quot;読み込み(read-eval-print-loop)&quot;、それを&quot;翻訳(compile)&quot;し、結果のコードを&quot;アセンブリ(assemble)&quot;して実行し、結果を&quot;印字(print-result)&quot;する。</p>
<pre><span class="Special">(</span><span class="Identifier">load</span> <span class="Constant">&quot;./register_machine.scm&quot;</span><span class="Special">)</span>
<span class="Special">(</span><span class="Identifier">load</span> <span class="Constant">&quot;./compiler.scm&quot;</span><span class="Special">)</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>empty-arglist<span class="Special">)</span> <span class="Special">'())</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>last-operand? ops<span class="Special">)</span>
  <span class="Special">(</span><span class="Identifier">null?</span> <span class="Special">(</span><span class="Identifier">cdr</span> ops<span class="Special">)))</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>adjoin-arg arg arglist<span class="Special">)</span>
  <span class="Special">(</span><span class="Identifier">append</span> arglist <span class="Special">(</span><span class="Identifier">list</span> arg<span class="Special">)))</span>

<span class="Special">(</span><span class="Statement">define</span> the-global-environment <span class="Special">(</span>setup-environment<span class="Special">))</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>get-global-environment<span class="Special">)</span>
  the-global-environment<span class="Special">)</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>make-compiled-procedure entry env<span class="Special">)</span>
  <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>compiled-procedure entry env<span class="Special">))</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>compiled-procedure? proc<span class="Special">)</span>
  <span class="Special">(</span>tagged-list? proc <span class="Special">'</span>compiled-procedure<span class="Special">))</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>compiled-procedure-entry c-proc<span class="Special">)</span>
  <span class="Special">(</span><span class="Identifier">cadr</span> c-proc<span class="Special">))</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>compiled-procedure-env c-proc<span class="Special">)</span>
  <span class="Special">(</span><span class="Identifier">caddr</span> c-proc<span class="Special">))</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>make-register-machine<span class="Special">)</span> register-machine<span class="Special">)</span>

<span class="Special">(</span><span class="Statement">define</span> operations
  <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>self-evaluating? self-evaluating?<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>variable? variable?<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>quoted? quoted?<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>assignment? assignment?<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>definition? definition?<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>if? if?<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>lambda? lambda?<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>begin? begin?<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>application? application?<span class="Special">)</span>
        <span class="Comment">;;;</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>lookup-variable-value lookup-variable-value<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>text-of-quotation text-of-quotation<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>lambda-parameters lambda-parameters<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>lambda-body lambda-body<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>make-procedure make-procedure<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>operands operands<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>operator operator<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>empty-arglist empty-arglist<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>no-operands? no-operands?<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>first-operand first-operand<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>last-operand? last-operand?<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>adjoin-arg adjoin-arg<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>rest-operands rest-operands<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>primitive-procedure? primitive-procedure?<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>compound-procedure? compound-procedure?<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>apply-primitive-procedure apply-primitive-procedure<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>procedure-parameters procedure-parameters<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>procedure-environment procedure-environment<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>extend-environment extend-environment<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>procedure-body procedure-body<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>begin-actions begin-actions<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>first-exp first-exp<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>last-exp? last-exp?<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>rest-exps rest-exps<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>if-predicate if-predicate<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>true? true?<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>if-alternative if-alternative<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>if-consequent if-consequent<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>assignment-variable assignment-variable<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>assignment-value assignment-value<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>set-variable-value! set-variable-value!<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>definition-variable definition-variable<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>definition-value definition-value<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>define-variable! define-variable!<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>prompt-for-input prompt-for-input<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>read <span class="Identifier">read</span><span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>get-global-environment get-global-environment<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>announce-output announce-output<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>user-print user-print<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>make-compiled-procedure make-compiled-procedure<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>compiled-procedure? compiled-procedure?<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>compiled-procedure-entry compiled-procedure-entry<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>compiled-procedure-env compiled-procedure-env<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>list <span class="Identifier">list</span><span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>cons <span class="Identifier">cons</span><span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>false? false?<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>print-stack-statistics<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>make-register-machine make-register-machine<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>compile compile<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>statements statements<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>assemble assemble<span class="Special">)</span>
        <span class="Special">))</span>

<span class="Special">(</span><span class="Statement">define</span> register-machine
  <span class="Special">(</span>make-machine
    <span class="Special">'(</span>exp env val proc argl continue unev compapp machine<span class="Special">)</span>
    operations
    <span class="Special">'(</span>
        <span class="Special">(</span>assign machine <span class="Special">(</span>op make-register-machine<span class="Special">))</span>
      <span class="PreProc">read-eval-print-loop</span>
        <span class="Special">(</span>perform <span class="Special">(</span>op initialize-stack<span class="Special">))</span>
        <span class="Special">(</span>perform
          <span class="Special">(</span>op prompt-for-input<span class="Special">)</span> <span class="Special">(</span>const <span class="Constant">&quot;;;; RM-Eval input:&quot;</span><span class="Special">))</span>
        <span class="Special">(</span>assign exp <span class="Special">(</span>op read<span class="Special">))</span>
        <span class="Special">(</span>assign env <span class="Special">(</span>op get-global-environment<span class="Special">))</span>
        <span class="Special">(</span>assign continue <span class="Special">(</span>label print-result<span class="Special">))</span>
        <span class="Special">(</span>goto <span class="Special">(</span>label compile<span class="Special">))</span>
      print-result
        <span class="Special">(</span>perform <span class="Special">(</span>op print-stack-statistics<span class="Special">))</span>
        <span class="Special">(</span>perform
          <span class="Special">(</span>op announce-output<span class="Special">)</span> <span class="Special">(</span>const <span class="Constant">&quot;;;; RM-Eval value:&quot;</span><span class="Special">))</span>
        <span class="Special">(</span>perform <span class="Special">(</span>op user-print<span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">))</span>
        <span class="Special">(</span>goto <span class="Special">(</span>label <span class="PreProc">read-eval-print-loop</span><span class="Special">))</span>
      compile
        <span class="Special">(</span>assign exp <span class="Special">(</span>op compile<span class="Special">)</span> <span class="Special">(</span>reg exp<span class="Special">)</span> <span class="Special">(</span>const val<span class="Special">)</span> <span class="Special">(</span>const return<span class="Special">))</span>
        <span class="Special">(</span>assign exp <span class="Special">(</span>op statements<span class="Special">)</span> <span class="Special">(</span>reg exp<span class="Special">))</span>
        <span class="Special">(</span>goto <span class="Special">(</span>label assemble<span class="Special">))</span>
      assemble
        <span class="Special">(</span>assign val <span class="Special">(</span>op assemble<span class="Special">)</span> <span class="Special">(</span>reg exp<span class="Special">)</span> <span class="Special">(</span>reg machine<span class="Special">))</span>
        <span class="Special">(</span>goto <span class="Special">(</span>reg val<span class="Special">))</span>
      <span class="Special">)))</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>start-register-machine<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">set!</span> the-global-environment <span class="Special">(</span>setup-environment<span class="Special">))</span>
  <span class="Special">(</span>set-register-contents! register-machine <span class="Special">'</span>flag false<span class="Special">)</span>
  <span class="Special">(</span>start register-machine<span class="Special">))</span>
</pre>
<p>実行結果</p>
<pre>$ gosh
gosh&gt; (load &quot;./sicp-ex5.49.scm&quot;)
#t
gosh&gt; (start-register-machine)

;;; RM-Eval input:
(define (factorial n)- n 1)) n)))
  (if (= n 1)
      1
      (* (factorial (- n 1)) n)))

(total-pushes = 0 max-depth = 0)
;;; RM-Eval value:
ok

;;; RM-Eval input:
(factorial 5)

(total-pushes = 26 max-depth = 14)
;;; RM-Eval value:
120
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:7pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51ZSMEJ9Y2L._SL160_.jpg" alt="計算機プログラムの構造と解釈" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-top:10px;margin-left:15px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">計算機プログラムの構造と解釈</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/489471163X/serendip7822-22/ref=nosim/" title="計算機プログラムの構造と解釈" target="_blank">amazlet</a> at 08.11.07</div>
</div>
<div class="amazlet-detail">ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン <br />ピアソンエデュケーション <br />売り上げランキング: 6542</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/4005/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>問題5.48 &#8211; SICP（計算機プログラムの構造と解釈）その300</title>
		<link>http://www.serendip.ws/archives/3998</link>
		<comments>http://www.serendip.ws/archives/3998#comments</comments>
		<pubDate>Tue, 29 Dec 2009 03:27:23 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[sicp]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=3998</guid>
		<description><![CDATA[問題5.48 ;; 環境に compile-and-run を基本手続として追加する。 (define (setup-environment2) (extend-environment (list 'compile-an [...]]]></description>
			<content:encoded><![CDATA[<h3>問題5.48</h3>
<pre><span class="Comment">;; 環境に compile-and-run を基本手続として追加する。</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>setup-environment2<span class="Special">)</span>
  <span class="Special">(</span>extend-environment
    <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>compile-and-run<span class="Special">)</span>
    <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>primitive compile-and-run<span class="Special">))</span>
    <span class="Special">(</span>setup-environment<span class="Special">)))</span>

<span class="Comment">;; setup-environment2 を呼び出すように変更する。</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>compile-and-go expression<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>instructions
          <span class="Special">(</span>assemble <span class="Special">(</span>statements
                      <span class="Special">(</span>compile expression <span class="Special">'</span>val <span class="Special">'</span>return<span class="Special">))</span>
                    eceval<span class="Special">)))</span>
       <span class="Special">(</span><span class="Statement">set!</span> the-global-environment <span class="Special">(</span>setup-environment2<span class="Special">))</span>
       <span class="Special">(</span>set-register-contents! eceval <span class="Special">'</span>val instructions<span class="Special">)</span>
       <span class="Special">(</span>set-register-contents! eceval <span class="Special">'</span>flag true<span class="Special">)</span>
       <span class="Special">(</span>start eceval<span class="Special">)))</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>compile-and-run? proc<span class="Special">)</span>
  <span class="Special">(</span>tagged-list? proc <span class="Special">'</span>compile-and-run<span class="Special">))</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>compile-and-run expression<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>instructions
          <span class="Special">(</span>assemble <span class="Special">(</span>statements
                      <span class="Special">(</span>compile expression <span class="Special">'</span>val <span class="Special">'</span>return<span class="Special">))</span>
                    eceval<span class="Special">)))</span>
       <span class="Special">(</span>set-register-contents! eceval <span class="Special">'</span>val instructions<span class="Special">)</span>
       <span class="Special">(</span>set-register-contents! eceval <span class="Special">'</span>flag true<span class="Special">)</span>
       <span class="Special">(</span>start eceval<span class="Special">)))</span>

<span class="Special">(</span><span class="Statement">define</span> eceval-operations
  <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>self-evaluating? self-evaluating?<span class="Special">)</span>
        <span class="Comment">;; 省略</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>compile-and-run? compile-and-run?<span class="Special">)</span>
        <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">'</span>compile-and-run compile-and-run<span class="Special">)</span>
        <span class="Comment">;; 省略</span>
        <span class="Special">))</span>

<span class="Special">(</span><span class="Statement">define</span> eceval
      <span class="Comment">;; 省略</span>
      ev-compile-and-run
        <span class="Special">(</span>perform <span class="Special">(</span>op compile-and-run<span class="Special">)</span> <span class="Special">(</span>reg <span class="Identifier">exp</span><span class="Special">))</span>
        <span class="Special">(</span>goto <span class="Special">(</span>reg continue<span class="Special">))</span>
      <span class="Comment">;; 省略</span>
      <span class="Special">)))</span>
</pre>
<p>翻訳した Factorial 手続き(factorial)と合成手続きの Factorial (factorial2) での total-pushes と max-depth を比較すると、積極制御評価器上で compile-and-run 手続きを使って翻訳できていることがわかる。</p>
<pre>$ gosh
gosh&gt; (load &quot;./ece4compiler.scm&quot;)
#t
gosh&gt; (compile-and-go
  '(define (square x) (* x x)))

(total-pushes = 0 max-depth = 0)
;;; EC-Eval value:
ok

;;; EC-Eval input:
(square 4)

(total-pushes = 5 max-depth = 3)
;;; EC-Eval value:
16

;;; EC-Eval input:
(compile-and-run
  '(define (factorial n)
     (if (= n 1)
         1
         (* (factorial (- n 1)) n))))

(total-pushes = 0 max-depth = 0)
;;; EC-Eval value:
ok

;;; EC-Eval input:
(factorial 5) <span class="Comment">; &lt;= 翻訳した Factorial</span>

(total-pushes = 31 max-depth = 14)
;;; EC-Eval value:
120

;;; EC-Eval input:
(define (factorial2 n)
  (if (= n 1)
      1
      (* (factorial2 (- n 1)) n)))

(total-pushes = 3 max-depth = 3)
;;; EC-Eval value:
ok

;;; EC-Eval input:
(factorial2 5) <span class="Comment">; &lt;= 合成手続き（解釈された手続き）の Factorial</span>

(total-pushes = 144 max-depth = 28)
;;; EC-Eval value:
120
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:7pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51ZSMEJ9Y2L._SL160_.jpg" alt="計算機プログラムの構造と解釈" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-top:10px;margin-left:15px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">計算機プログラムの構造と解釈</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/489471163X/serendip7822-22/ref=nosim/" title="計算機プログラムの構造と解釈" target="_blank">amazlet</a> at 08.11.07</div>
</div>
<div class="amazlet-detail">ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン <br />ピアソンエデュケーション <br />売り上げランキング: 6542</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/3998/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>問題5.47 &#8211; SICP（計算機プログラムの構造と解釈）その299</title>
		<link>http://www.serendip.ws/archives/3983</link>
		<comments>http://www.serendip.ws/archives/3983#comments</comments>
		<pubDate>Mon, 28 Dec 2009 14:09:13 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[sicp]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=3983</guid>
		<description><![CDATA[問題5.47 元の翻訳系では翻訳した手続きが合成手続き（解釈される手続き）を呼び出せない。 $ gosh gosh&#62; (load &#34;./ece4compiler.scm&#34;) #t (compil [...]]]></description>
			<content:encoded><![CDATA[<h3>問題5.47</h3>
<p>元の翻訳系では翻訳した手続きが合成手続き（解釈される手続き）を呼び出せない。</p>
<pre>$ gosh
gosh&gt; (load &quot;./ece4compiler.scm&quot;)
#t
(compile-and-go
  '(begin
     (define (g x) (+ x 10))
     (define (f x) (g x))))

(total-pushes = 0 max-depth = 0)
;;; EC-Eval value:
ok

;;; EC-Eval input:
(f 1) <span class="Comment">; &lt;= 翻訳した手続き g を呼び出す</span>

(total-pushes = 5 max-depth = 3)
;;; EC-Eval value:
11

;;; EC-Eval input:
(define (g x) (+ x 20)) <span class="Comment">; &lt;= 合成手続きを定義する</span>

(total-pushes = 3 max-depth = 3)
;;; EC-Eval value:
ok

;;; EC-Eval input:
(f 1) <span class="Comment">; &lt;= 合成手続き g の呼び出しに失敗する</span>
*** ERROR: pair required, but got x
Stack Trace:
_______________________________________
  0  (instruction-execution-proc (car insts))
        At line 129 of &quot;./register_machine.scm&quot;
  1  (instruction-execution-proc (car insts))
        At line 129 of &quot;./register_machine.scm&quot;
gosh&gt;
</pre>
<p><code>compile-proc-appl</code> と同様の条件分岐を追加する。<br />
<code>compound-apply</code> に移動するために continue を退避させる。</p>
<pre><span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>compile-procedure-call target linkage<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>primitive-branch <span class="Special">(</span>make-label <span class="Special">'</span>primitive-branch<span class="Special">))</span>
        <span class="Special">(</span>compiled-branch <span class="Special">(</span>make-label <span class="Special">'</span>compiled-branch<span class="Special">))</span>
        <span class="Special">(</span>after-call <span class="Special">(</span>make-label <span class="Special">'</span>after-call<span class="Special">)))</span>
       <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>compiled-linkage
               <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">eq?</span> linkage <span class="Special">'</span>next<span class="Special">)</span> after-call linkage<span class="Special">)))</span>
            <span class="Special">(</span>append-instruction-sequences
              <span class="Special">(</span>make-instruction-sequence <span class="Special">'(</span>proc<span class="Special">)</span> <span class="Special">'()</span>
                                         <span class="Special">`((</span><span class="PreProc">test</span> <span class="Special">(</span>op primitive-procedure?<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
                                           <span class="Special">(</span>branch <span class="Special">(</span>label <span class="Special">,</span>primitive-branch<span class="Special">))))</span>
              <span class="Special">(</span>make-instruction-sequence <span class="Special">'(</span>proc<span class="Special">)</span> <span class="Special">'()</span>
                                         <span class="Special">`((</span><span class="PreProc">test</span> <span class="Special">(</span>op compiled-procedure?<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
                                           <span class="Special">(</span>branch <span class="Special">(</span>label <span class="Special">,</span>compiled-branch<span class="Special">))))</span>
              <span class="Special">(</span>parallel-instruction-sequences
                <span class="Special">(</span><span class="Statement">cond</span> <span class="Special">((</span><span class="Statement">and</span> <span class="Special">(</span><span class="Identifier">eq?</span> target <span class="Special">'</span>val<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">not</span> <span class="Special">(</span><span class="Identifier">eq?</span> compiled-linkage <span class="Special">'</span>return<span class="Special">)))</span>
                       <span class="Special">(</span>make-instruction-sequence <span class="Special">'(</span>proc<span class="Special">)</span>all-regs
                                                  <span class="Special">`((</span>assign continue <span class="Special">(</span>label <span class="Special">,</span>compiled-linkage<span class="Special">))</span>
                                                    <span class="Special">(</span>save continue<span class="Special">)</span>
                                                    <span class="Special">(</span>goto <span class="Special">(</span>reg compapp<span class="Special">)))))</span>
                      <span class="Special">((</span><span class="Statement">and</span> <span class="Special">(</span><span class="Identifier">not</span> <span class="Special">(</span><span class="Identifier">eq?</span> target <span class="Special">'</span>val<span class="Special">))</span>
                            <span class="Special">(</span><span class="Identifier">not</span> <span class="Special">(</span><span class="Identifier">eq?</span> compiled-linkage <span class="Special">'</span>return<span class="Special">)))</span>
                       <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>proc-return <span class="Special">(</span>make-label <span class="Special">'</span>proc-return<span class="Special">)))</span>
                            <span class="Special">(</span>make-instruction-sequence <span class="Special">'(</span>proc<span class="Special">)</span> all-regs
                                                       <span class="Special">`((</span>assign continue <span class="Special">(</span>label <span class="Special">,</span>proc-return<span class="Special">))</span>
                                                         <span class="Special">(</span>save continue<span class="Special">)</span>
                                                         <span class="Special">(</span>goto <span class="Special">(</span>reg compapp<span class="Special">))</span>
                                                         <span class="Special">,</span>proc-return
                                                         <span class="Special">(</span>assign <span class="Special">,</span>target <span class="Special">(</span>reg val<span class="Special">))</span>
                                                         <span class="Special">(</span>goto <span class="Special">(</span>label <span class="Special">,</span>compiled-linkage<span class="Special">))))))</span>
                      <span class="Special">((</span><span class="Statement">and</span> <span class="Special">(</span><span class="Identifier">eq?</span> target <span class="Special">'</span>val<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">eq?</span> compiled-linkage <span class="Special">'</span>return<span class="Special">))</span>
                       <span class="Special">(</span>make-instruction-sequence <span class="Special">'(</span>proc continue<span class="Special">)</span> all-regs
                                                  <span class="Special">'((</span>save continue<span class="Special">)</span>
                                                    <span class="Special">(</span>goto <span class="Special">(</span>reg compapp<span class="Special">)))))</span>
                      <span class="Special">((</span><span class="Statement">and</span> <span class="Special">(</span><span class="Identifier">not</span> <span class="Special">(</span><span class="Identifier">eq?</span> target <span class="Special">'</span>val<span class="Special">))</span> <span class="Special">(</span><span class="Identifier">eq?</span> compiled-linkage <span class="Special">'</span>return<span class="Special">))</span>
                       <span class="Special">(</span><span class="PreProc">error</span> <span class="Constant">&quot;return linkage, target not val -- COMPILE&quot;</span>
                              target<span class="Special">)))</span>
                <span class="Special">(</span>parallel-instruction-sequences
                  <span class="Special">(</span>append-instruction-sequences
                    compiled-branch
                    <span class="Special">(</span>compile-proc-appl target compiled-linkage<span class="Special">))</span>
                  <span class="Special">(</span>append-instruction-sequences
                    primitive-branch
                    <span class="Special">(</span>end-with-linkage linkage
                                      <span class="Special">(</span>make-instruction-sequence <span class="Special">'(</span>proc argl<span class="Special">)</span>
                                                                 <span class="Special">(</span><span class="Identifier">list</span> target<span class="Special">)</span>
                                                                 <span class="Special">`((</span>assign <span class="Special">,</span>target
                                                                           <span class="Special">(</span>op apply-primitive-procedure<span class="Special">)</span>
                                                                           <span class="Special">(</span>reg proc<span class="Special">)</span>
                                                                           <span class="Special">(</span>reg argl<span class="Special">))))))))</span>
                after-call<span class="Special">))))</span>
</pre>
<p><code>compapp</code> レジスタの追加と初期化コードを加える。</p>
<pre><span class="Special">(</span><span class="Statement">define</span> eceval
  <span class="Special">(</span>make-machine
    <span class="Special">'(</span>exp env val proc argl continue unev compapp<span class="Special">)</span>
    eceval-operations
    <span class="Special">'(</span>
        <span class="Special">(</span>assign compapp <span class="Special">(</span>label compound-apply<span class="Special">))</span>
        <span class="Special">(</span>branch <span class="Special">(</span>label external-entry<span class="Special">))</span> <span class="Comment">; flag が設定してあれば分岐する</span>
      <span class="PreProc">read-eval-print-loop</span>
      <span class="Comment">;; 省略</span>
</pre>
<p>実行結果</p>
<pre>$ gosh
gosh&gt; (load &quot;./ece4compiler.scm&quot;)
#t
(compile-and-go
  '(begin
     (define (g x) (+ x 10))
     (define (f x) (g x))))

(total-pushes = 0 max-depth = 0)
;;; EC-Eval value:
ok

;;; EC-Eval input:
(f 1) <span class="Comment">; &lt;= 翻訳した手続き g を呼び出す</span>

(total-pushes = 5 max-depth = 3)
;;; EC-Eval value:
11

;;; EC-Eval input:
(define (g x) (+ x 20)) <span class="Comment">; &lt;= 合成手続きを定義する</span>

(total-pushes = 3 max-depth = 3)
;;; EC-Eval value:
ok

;;; EC-Eval input:
(f 1) <span class="Comment">; &lt;= 合成手続き g を呼び出す</span>

(total-pushes = 14 max-depth = 5)
;;; EC-Eval value:
21
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:7pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51ZSMEJ9Y2L._SL160_.jpg" alt="計算機プログラムの構造と解釈" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-top:10px;margin-left:15px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">計算機プログラムの構造と解釈</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/489471163X/serendip7822-22/ref=nosim/" title="計算機プログラムの構造と解釈" target="_blank">amazlet</a> at 08.11.07</div>
</div>
<div class="amazlet-detail">ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン <br />ピアソンエデュケーション <br />売り上げランキング: 6542</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/3983/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>問題5.46 &#8211; SICP（計算機プログラムの構造と解釈）その298</title>
		<link>http://www.serendip.ws/archives/3962</link>
		<comments>http://www.serendip.ws/archives/3962#comments</comments>
		<pubDate>Mon, 28 Dec 2009 06:40:11 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[sicp]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=3962</guid>
		<description><![CDATA[Fibonacci でのプッシュ回数、最大スタック深さを翻訳版、解釈版、特殊目的版で比較する。 プッシュ回数の比較 n 翻訳版 解釈版 特殊目的版 翻訳版と解釈版の比率 翻訳版と特殊目的版の比率 3 27 128 8 4 [...]]]></description>
			<content:encoded><![CDATA[<p>Fibonacci でのプッシュ回数、最大スタック深さを翻訳版、解釈版、特殊目的版で比較する。</p>
<h4>プッシュ回数の比較</h4>
<table class="entry-table-style">
<tr>
<th>n</th>
<th>翻訳版</th>
<th>解釈版</th>
<th>特殊目的版</th>
<th>翻訳版と解釈版の比率</th>
<th>翻訳版と特殊目的版の比率</th>
</tr>
<tr>
<td>3</td>
<td>27</td>
<td>128</td>
<td>8</td>
<td>4.741</td>
<td>0.296</td>
</tr>
<tr>
<td>4</td>
<td>47</td>
<td>240</td>
<td>16</td>
<td>5.106</td>
<td>0.340</td>
</tr>
<tr>
<td>5</td>
<td>77</td>
<td>408</td>
<td>28</td>
<td>5.299</td>
<td>0.364</td>
</tr>
<tr>
<td>6</td>
<td>127</td>
<td>688</td>
<td>48</td>
<td>5.417</td>
<td>0.378</td>
</tr>
<tr>
<td>7</td>
<td>207</td>
<td>1136</td>
<td>80</td>
<td>5.488</td>
<td>0.386</td>
</tr>
<tr>
<td>8</td>
<td>337</td>
<td>1864</td>
<td>132</td>
<td>5.531</td>
<td>0.392</td>
</tr>
<tr>
<td>9</td>
<td>547</td>
<td>3040</td>
<td>216</td>
<td>5.558</td>
<td>0.395</td>
</tr>
<tr>
<td>10</td>
<td>887</td>
<td>4944</td>
<td>352</td>
<td>5.574</td>
<td>0.397</td>
</tr>
<tr>
<td>15</td>
<td>9867</td>
<td>55232</td>
<td>3944</td>
<td>5.598</td>
<td>0.400</td>
</tr>
<tr>
<td>20</td>
<td>109457</td>
<td>612936</td>
<td>43780</td>
<td>5.600</td>
<td>0.400</td>
</tr>
</table>
<p><code>n</code> の増加にともなって実行時間の差が大きくなってくる。</p>
<h4>最大スタック深さの比較</h4>
<table class="entry-table-style">
<tr>
<th>n</th>
<th>翻訳版</th>
<th>解釈版</th>
<th>特殊目的版</th>
<th>翻訳版と解釈版の比率</th>
<th>翻訳版と特殊目的版の比率</th>
</tr>
<tr>
<td>3</td>
<td>8</td>
<td>18</td>
<td>4</td>
<td>2.250</td>
<td>0.500</td>
</tr>
<tr>
<td>4</td>
<td>11</td>
<td>23</td>
<td>6</td>
<td>2.091</td>
<td>0.545</td>
</tr>
<tr>
<td>5</td>
<td>14</td>
<td>28</td>
<td>8</td>
<td>2.000</td>
<td>0.571</td>
</tr>
<tr>
<td>6</td>
<td>17</td>
<td>33</td>
<td>10</td>
<td>1.941</td>
<td>0.588</td>
</tr>
<tr>
<td>7</td>
<td>20</td>
<td>38</td>
<td>12</td>
<td>1.900</td>
<td>0.600</td>
</tr>
<tr>
<td>8</td>
<td>23</td>
<td>43</td>
<td>14</td>
<td>1.870</td>
<td>0.609</td>
</tr>
<tr>
<td>9</td>
<td>26</td>
<td>48</td>
<td>16</td>
<td>1.846</td>
<td>0.615</td>
</tr>
<tr>
<td>10</td>
<td>29</td>
<td>53</td>
<td>18</td>
<td>1.828</td>
<td>0.621</td>
</tr>
<tr>
<td>15</td>
<td>44</td>
<td>78</td>
<td>28</td>
<td>1.773</td>
<td>0.636</td>
</tr>
<tr>
<td>20</td>
<td>59</td>
<td>103</td>
<td>38</td>
<td>1.746</td>
<td>0.644</td>
</tr>
</table>
<div class="amazlet-box" style="margin-bottom:0px;font-size:7pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51ZSMEJ9Y2L._SL160_.jpg" alt="計算機プログラムの構造と解釈" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-top:10px;margin-left:15px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">計算機プログラムの構造と解釈</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/489471163X/serendip7822-22/ref=nosim/" title="計算機プログラムの構造と解釈" target="_blank">amazlet</a> at 08.11.07</div>
</div>
<div class="amazlet-detail">ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン <br />ピアソンエデュケーション <br />売り上げランキング: 6542</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/3962/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>問題5.45 &#8211; SICP（計算機プログラムの構造と解釈）その297</title>
		<link>http://www.serendip.ws/archives/3926</link>
		<comments>http://www.serendip.ws/archives/3926#comments</comments>
		<pubDate>Sun, 27 Dec 2009 13:36:13 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[sicp]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=3926</guid>
		<description><![CDATA[問題5.45 push回数 n 翻訳版 解釈版 翻訳版と解釈版の比率 特殊目的版 翻訳版と特殊目的版の比率 3 19 80 4.211 4 0.211 4 25 112 4.480 6 0.240 5 31 144 4. [...]]]></description>
			<content:encoded><![CDATA[<h3>問題5.45</h3>
<h4>push回数</h4>
<table class="entry-table-style">
<tr>
<th>n</th>
<th>翻訳版</th>
<th>解釈版</th>
<th>翻訳版と解釈版の比率</th>
<th>特殊目的版</th>
<th>翻訳版と特殊目的版の比率</th>
</tr>
<tr>
<td>3</td>
<td>19</td>
<td>80</td>
<td>4.211</td>
<td>4</td>
<td>0.211</td>
</tr>
<tr>
<td>4</td>
<td>25</td>
<td>112</td>
<td>4.480</td>
<td>6</td>
<td>0.240</td>
</tr>
<tr>
<td>5</td>
<td>31</td>
<td>144</td>
<td>4.645</td>
<td>8</td>
<td>0.258</td>
</tr>
<tr>
<td>6</td>
<td>37</td>
<td>176</td>
<td>4.757</td>
<td>10</td>
<td>0.270</td>
</tr>
<tr>
<td>7</td>
<td>43</td>
<td>208</td>
<td>4.837</td>
<td>12</td>
<td>0.279</td>
</tr>
<tr>
<td>8</td>
<td>49</td>
<td>240</td>
<td>4.898</td>
<td>14</td>
<td>0.286</td>
</tr>
<tr>
<td>30</td>
<td>181</td>
<td>944</td>
<td>5.215</td>
<td>58</td>
<td>0.320</td>
</tr>
<tr>
<td>50</td>
<td>301</td>
<td>1584</td>
<td>5.262</td>
<td>98</td>
<td>0.326</td>
</tr>
<tr>
<td>100</td>
<td>601</td>
<td>3184</td>
<td>5.298</td>
<td>198</td>
<td>0.329</td>
</tr>
<tr>
<td>500</td>
<td>3001</td>
<td>15984</td>
<td>5.326</td>
<td>998</td>
<td>0.333</td>
</tr>
<tr>
<td>1000</td>
<td>6001</td>
<td>31984</td>
<td>5.330</td>
<td>1998</td>
<td>0.333</td>
</tr>
</table>
<p>push回数での翻訳版に対する各比率は、解釈版が約5.33、特殊目的版が約0.33に収束している。</p>
<h4>最大スタック深さ</h4>
<table class="entry-table-style">
<tr>
<th>n</th>
<th>翻訳版</th>
<th>解釈版</th>
<th>翻訳版と解釈版の比率</th>
<th>特殊目的版</th>
<th>翻訳版と特殊目的版の比率</th>
</tr>
<tr>
<td>3</td>
<td>8</td>
<td>18</td>
<td>2.250</td>
<td>4</td>
<td>0.500</td>
</tr>
<tr>
<td>4</td>
<td>11</td>
<td>23</td>
<td>2.091</td>
<td>6</td>
<td>0.545</td>
</tr>
<tr>
<td>5</td>
<td>14</td>
<td>28</td>
<td>2.000</td>
<td>8</td>
<td>0.571</td>
</tr>
<tr>
<td>6</td>
<td>17</td>
<td>33</td>
<td>1.941</td>
<td>10</td>
<td>0.588</td>
</tr>
<tr>
<td>7</td>
<td>20</td>
<td>38</td>
<td>1.900</td>
<td>12</td>
<td>0.600</td>
</tr>
<tr>
<td>8</td>
<td>23</td>
<td>43</td>
<td>1.870</td>
<td>14</td>
<td>0.609</td>
</tr>
<tr>
<td>30</td>
<td>89</td>
<td>153</td>
<td>1.719</td>
<td>58</td>
<td>0.652</td>
</tr>
<tr>
<td>50</td>
<td>149</td>
<td>253</td>
<td>1.698</td>
<td>98</td>
<td>0.658</td>
</tr>
<tr>
<td>100</td>
<td>299</td>
<td>503</td>
<td>1.682</td>
<td>198</td>
<td>0.662</td>
</tr>
<tr>
<td>500</td>
<td>1499</td>
<td>2503</td>
<td>1.670</td>
<td>998</td>
<td>0.666</td>
</tr>
<tr>
<td>1000</td>
<td>2999</td>
<td>5003</td>
<td>1.668</td>
<td>1998</td>
<td>0.666</td>
</tr>
</table>
<p>最大スタック深さでの翻訳版に対する各比率は、解釈版が約1.67、特殊目的版が約0.66に収束している。</p>
<div class="amazlet-box" style="margin-bottom:0px;font-size:7pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51ZSMEJ9Y2L._SL160_.jpg" alt="計算機プログラムの構造と解釈" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-top:10px;margin-left:15px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">計算機プログラムの構造と解釈</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/489471163X/serendip7822-22/ref=nosim/" title="計算機プログラムの構造と解釈" target="_blank">amazlet</a> at 08.11.07</div>
</div>
<div class="amazlet-detail">ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン <br />ピアソンエデュケーション <br />売り上げランキング: 6542</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/3926/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>5.5.7 翻訳したコードと評価器のインターフェース &#8211; SICP（計算機プログラムの構造と解釈）その296</title>
		<link>http://www.serendip.ws/archives/3923</link>
		<comments>http://www.serendip.ws/archives/3923#comments</comments>
		<pubDate>Sun, 27 Dec 2009 12:40:03 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[sicp]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=3923</guid>
		<description><![CDATA[翻訳したコードを受け取った場合の処理を追加し、コードを翻訳して REPL 呼び出す手続きを追加する。 実行には以下のファイル群を利用する。 compiler.scm (5.5節の翻訳系) ece4compiler.scm [...]]]></description>
			<content:encoded><![CDATA[<p>翻訳したコードを受け取った場合の処理を追加し、コードを翻訳して <abbr title="Read Eval Print Loop">REPL</abbr> 呼び出す手続きを追加する。</p>
<p>実行には以下のファイル群を利用する。</p>
<ul>
<li>compiler.scm (5.5節の翻訳系)</li>
<li>ece4compiler.scm (5.4節の積極制御評価器計算機)</li>
<li>eval4ece.scm (4.1節の超循環評価器)</li>
<li>register_machine.scm (5.2節のレジスタ計算機)</li>
</ul>
<p>これらをまとめたアーカイブ(<a href="/resource/sicp5.5.7.zip">sicp5.5.7.zip</a>)。</p>
<p>実行してみる。</p>
<pre>$ gosh
gosh&gt; (load &quot;./ece4compiler.scm&quot;)
#t
gosh&gt; (compile-and-go
  '(define (factorial n)
     (if (= n 1)
         1
         (* (factorial (- n 1))  n))))

(total-pushes = 0 max-depth = 0)
;;; EC-Eval value:
ok

;;; EC-Eval input:
(factorial 5)

(total-pushes = 31 max-depth = 14)
;;; EC-Eval value:
120
</pre>
<p>ちゃんと動作している。</p>
<div class="amazlet-box" style="margin-bottom:0px;font-size:7pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51ZSMEJ9Y2L._SL160_.jpg" alt="計算機プログラムの構造と解釈" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-top:10px;margin-left:15px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">計算機プログラムの構造と解釈</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/489471163X/serendip7822-22/ref=nosim/" title="計算機プログラムの構造と解釈" target="_blank">amazlet</a> at 08.11.07</div>
</div>
<div class="amazlet-detail">ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン <br />ピアソンエデュケーション <br />売り上げランキング: 6542</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/3923/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>問題5.44 &#8211; SICP（計算機プログラムの構造と解釈）その295</title>
		<link>http://www.serendip.ws/archives/3862</link>
		<comments>http://www.serendip.ws/archives/3862#comments</comments>
		<pubDate>Sat, 26 Dec 2009 13:48:48 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[sicp]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=3862</guid>
		<description><![CDATA[問題5.44 compile の振り分け時に定義が上書きされているかを調べる。 (define (compile exp target linkage ct-env) ;; 省略 ((open-code-operator [...]]]></description>
			<content:encoded><![CDATA[<h3>問題5.44</h3>
<p><code>compile</code> の振り分け時に定義が上書きされているかを調べる。</p>
<pre><span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>compile <span class="Identifier">exp</span> target linkage ct-env<span class="Special">)</span>
  <span class="Comment">;; 省略</span>
        <span class="Special">((</span>open-code-operator? <span class="Identifier">exp</span> ct-env<span class="Special">)</span>
         <span class="Special">(</span>compile-open-code <span class="Identifier">exp</span> target linkage ct-env<span class="Special">))</span>
  <span class="Comment">;; 省略</span>
        <span class="Special">(</span><span class="Statement">else</span>
          <span class="Special">(</span><span class="PreProc">error</span> <span class="Constant">&quot;Unknown expression type -- COMPILE&quot;</span> <span class="Identifier">exp</span><span class="Special">))))</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>overwrite? operator ct-env<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>addr <span class="Special">(</span>find-variable operator ct-env<span class="Special">)))</span>
       <span class="Special">(</span><span class="Identifier">eq?</span> addr <span class="Special">'</span>not-found<span class="Special">)))</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>open-code-operator? <span class="Identifier">exp</span> ct-env<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">and</span> <span class="Special">(</span><span class="Identifier">memq</span> <span class="Special">(</span><span class="Identifier">car</span> <span class="Identifier">exp</span><span class="Special">)</span> <span class="Special">'(</span><span class="Constant">+</span> <span class="Constant">-</span> * / =<span class="Special">))</span>
       <span class="Special">(</span>overwrite? <span class="Special">(</span>operator <span class="Identifier">exp</span><span class="Special">)</span> ct-env<span class="Special">)))</span>
</pre>
<p>定義を上書きしている場合。</p>
<pre><span class="Special">(</span>parse-compiled-code
  <span class="Special">(</span>compile
    <span class="Special">'(</span>lambda <span class="Special">(</span><span class="Constant">+</span> * a b x y<span class="Special">)</span>
             <span class="Special">(</span><span class="Constant">+</span> <span class="Special">(</span>* a x<span class="Special">)</span> <span class="Special">(</span>* b y<span class="Special">)))</span>
    <span class="Special">'</span>val
    <span class="Special">'</span>next
    <span class="Special">'()))</span>
</pre>
<p>オープンコードは使われずに翻訳される。</p>
<pre><span class="Special">(</span>env<span class="Special">)</span>
<span class="Special">(</span>val<span class="Special">)</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op make-compiled-procedure<span class="Special">)</span> <span class="Special">(</span>label entry1<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>goto <span class="Special">(</span>label after-lambda2<span class="Special">))</span>
entry1
  <span class="Special">(</span>assign env <span class="Special">(</span>op compiled-procedure-env<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>assign env <span class="Special">(</span>op extend-environment<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span><span class="Identifier">+</span> <span class="Identifier">*</span> a b x y<span class="Special">))</span> <span class="Special">(</span>reg argl<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign proc <span class="Special">(</span>op lexical-address-lookup<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span><span class="Constant">0</span> <span class="Constant">0</span><span class="Special">))</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>save continue<span class="Special">)</span>
  <span class="Special">(</span>save proc<span class="Special">)</span>
  <span class="Special">(</span>save env<span class="Special">)</span>
  <span class="Special">(</span>assign proc <span class="Special">(</span>op lexical-address-lookup<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span><span class="Constant">0</span> <span class="Constant">1</span><span class="Special">))</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op lexical-address-lookup<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span><span class="Constant">0</span> <span class="Constant">5</span><span class="Special">))</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">list</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op lexical-address-lookup<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span><span class="Constant">0</span> <span class="Constant">3</span><span class="Special">))</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">cons</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
  <span class="Special">(</span><span class="PreProc">test</span> <span class="Special">(</span>op primitive-procedure?<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>branch <span class="Special">(</span>label primitive-branch6<span class="Special">))</span>
compiled-branch7
  <span class="Special">(</span>assign continue <span class="Special">(</span>label after-call8<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op compiled-procedure-entry<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>goto <span class="Special">(</span>reg val<span class="Special">))</span>
primitive-branch6
  <span class="Special">(</span>assign val <span class="Special">(</span>op apply-primitive-procedure<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
after-call8
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">list</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">))</span>
  <span class="Special">(</span>restore env<span class="Special">)</span>
  <span class="Special">(</span>save argl<span class="Special">)</span>
  <span class="Special">(</span>assign proc <span class="Special">(</span>op lexical-address-lookup<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span><span class="Constant">0</span> <span class="Constant">1</span><span class="Special">))</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op lexical-address-lookup<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span><span class="Constant">0</span> <span class="Constant">4</span><span class="Special">))</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">list</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op lexical-address-lookup<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span><span class="Constant">0</span> <span class="Constant">2</span><span class="Special">))</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">cons</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
  <span class="Special">(</span><span class="PreProc">test</span> <span class="Special">(</span>op primitive-procedure?<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>branch <span class="Special">(</span>label primitive-branch3<span class="Special">))</span>
compiled-branch4
  <span class="Special">(</span>assign continue <span class="Special">(</span>label after-call5<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op compiled-procedure-entry<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>goto <span class="Special">(</span>reg val<span class="Special">))</span>
primitive-branch3
  <span class="Special">(</span>assign val <span class="Special">(</span>op apply-primitive-procedure<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
after-call5
  <span class="Special">(</span>restore argl<span class="Special">)</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">cons</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
  <span class="Special">(</span>restore proc<span class="Special">)</span>
  <span class="Special">(</span>restore continue<span class="Special">)</span>
  <span class="Special">(</span><span class="PreProc">test</span> <span class="Special">(</span>op primitive-procedure?<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>branch <span class="Special">(</span>label primitive-branch9<span class="Special">))</span>
compiled-branch10
  <span class="Special">(</span>assign val <span class="Special">(</span>op compiled-procedure-entry<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>goto <span class="Special">(</span>reg val<span class="Special">))</span>
primitive-branch9
  <span class="Special">(</span>assign val <span class="Special">(</span>op apply-primitive-procedure<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
  <span class="Special">(</span>goto <span class="Special">(</span>reg continue<span class="Special">))</span>
after-call11
after-lambda2
</pre>
<p>定義が上書きされていない場合。</p>
<pre><span class="Special">(</span>parse-compiled-code
  <span class="Special">(</span>compile
    <span class="Special">'(</span><span class="Constant">+</span> <span class="Special">(</span>* a x<span class="Special">)</span> <span class="Special">(</span>* b y<span class="Special">))</span>
    <span class="Special">'</span>val
    <span class="Special">'</span>next
    <span class="Special">'()))</span>
</pre>
<p>オープンコードを使って翻訳される。</p>
<pre><span class="Special">(</span>env<span class="Special">)</span>
<span class="Special">(</span>arg1 arg2 val<span class="Special">)</span>
  <span class="Special">(</span>assign arg1 <span class="Special">(</span>op lookup-variable-value<span class="Special">)</span> <span class="Special">(</span>const a<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign arg2 <span class="Special">(</span>op lookup-variable-value<span class="Special">)</span> <span class="Special">(</span>const x<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign arg1 <span class="Special">(</span>op <span class="Identifier">*</span><span class="Special">)</span> <span class="Special">(</span>reg arg1<span class="Special">)</span> <span class="Special">(</span>reg arg2<span class="Special">))</span>
  <span class="Special">(</span>save arg1<span class="Special">)</span>
  <span class="Special">(</span>assign arg1 <span class="Special">(</span>op lookup-variable-value<span class="Special">)</span> <span class="Special">(</span>const b<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign arg2 <span class="Special">(</span>op lookup-variable-value<span class="Special">)</span> <span class="Special">(</span>const y<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign arg2 <span class="Special">(</span>op <span class="Identifier">*</span><span class="Special">)</span> <span class="Special">(</span>reg arg1<span class="Special">)</span> <span class="Special">(</span>reg arg2<span class="Special">))</span>
  <span class="Special">(</span>restore arg1<span class="Special">)</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op <span class="Identifier">+</span><span class="Special">)</span> <span class="Special">(</span>reg arg1<span class="Special">)</span> <span class="Special">(</span>reg arg2<span class="Special">))</span>
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:7pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51ZSMEJ9Y2L._SL160_.jpg" alt="計算機プログラムの構造と解釈" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-top:10px;margin-left:15px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">計算機プログラムの構造と解釈</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/489471163X/serendip7822-22/ref=nosim/" title="計算機プログラムの構造と解釈" target="_blank">amazlet</a> at 08.11.07</div>
</div>
<div class="amazlet-detail">ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン <br />ピアソンエデュケーション <br />売り上げランキング: 6542</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/3862/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>問題5.43 &#8211; SICP（計算機プログラムの構造と解釈）その294</title>
		<link>http://www.serendip.ws/archives/3859</link>
		<comments>http://www.serendip.ws/archives/3859#comments</comments>
		<pubDate>Sat, 26 Dec 2009 11:28:19 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[sicp]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=3859</guid>
		<description><![CDATA[問題5.43 4.1.6節の問題4.16で作った scan-out-defines を compile-lambda-body に組み込む (define (compile-lambda-body exp proc-en [...]]]></description>
			<content:encoded><![CDATA[<h3>問題5.43</h3>
<p>4.1.6節の<a href="/archives/1973">問題4.16</a>で作った <code>scan-out-defines</code> を <code>compile-lambda-body</code> に組み込む</p>
<pre><span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>compile-lambda-body <span class="Identifier">exp</span> proc-entry ct-env<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>formals <span class="Special">(</span>lambda-parameters <span class="Identifier">exp</span><span class="Special">)))</span>
       <span class="Special">(</span>append-instruction-sequences
         <span class="Special">(</span>make-instruction-sequence
           <span class="Special">'(</span>env proc argl<span class="Special">)</span>
           <span class="Special">'(</span>env<span class="Special">)</span>
           <span class="Special">`(,</span>proc-entry
              <span class="Special">(</span>assign env <span class="Special">(</span>op compiled-procedure-env<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
              <span class="Special">(</span>assign env
                      <span class="Special">(</span>op extend-environment<span class="Special">)</span>
                      <span class="Special">(</span>const <span class="Special">,</span>formals<span class="Special">)</span>
                      <span class="Special">(</span>reg argl<span class="Special">)</span>
                      <span class="Special">(</span>reg env<span class="Special">))))</span>
         <span class="Special">(</span>compile-sequence
           <span class="Special">(</span>scan-out-defines <span class="Special">(</span>lambda-body <span class="Identifier">exp</span><span class="Special">))</span>
           <span class="Special">'</span>val
           <span class="Special">'</span>return
           <span class="Special">(</span><span class="Identifier">cons</span> formals ct-env<span class="Special">)))))</span>
</pre>
<p>以下のサンプルコードを <code>scan-out-defines</code> を使って内部定義の掃き出しを行った版と元の版とで比較する。</p>
<pre><span class="Special">(</span>parse-compiled-code
  <span class="Special">(</span>compile
    <span class="Special">'(</span>lambda <span class="Special">(</span>x y<span class="Special">)</span>
             <span class="Special">(</span>define u <span class="Special">(</span><span class="Constant">+</span> u x<span class="Special">))</span>
             <span class="Special">(</span>define v <span class="Special">(</span><span class="Constant">-</span> v y<span class="Special">))</span>
             <span class="Special">(</span>* u v<span class="Special">))</span>
    <span class="Special">'</span>val
    <span class="Special">'</span>next
    <span class="Special">'()))</span>
</pre>
<p><code>scan-out-defines</code> を使って内部定義の掃き出しを行った版での翻訳結果。</p>
<pre><span class="Special">(</span>env<span class="Special">)</span>
<span class="Special">(</span>val<span class="Special">)</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op make-compiled-procedure<span class="Special">)</span> <span class="Special">(</span>label entry1<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>goto <span class="Special">(</span>label after-lambda2<span class="Special">))</span>
entry1
  <span class="Special">(</span>assign env <span class="Special">(</span>op compiled-procedure-env<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>assign env <span class="Special">(</span>op extend-environment<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span>x y<span class="Special">))</span> <span class="Special">(</span>reg argl<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign proc <span class="Special">(</span>op make-compiled-procedure<span class="Special">)</span> <span class="Special">(</span>label entry3<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>goto <span class="Special">(</span>label after-lambda4<span class="Special">))</span>
entry3
  <span class="Special">(</span>assign env <span class="Special">(</span>op compiled-procedure-env<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>assign env <span class="Special">(</span>op extend-environment<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span>u v<span class="Special">))</span> <span class="Special">(</span>reg argl<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>save continue<span class="Special">)</span>
  <span class="Special">(</span>save env<span class="Special">)</span>
  <span class="Special">(</span>assign proc <span class="Special">(</span>op lookup-variable-value<span class="Special">)</span> <span class="Special">(</span>const <span class="Identifier">+</span><span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op lexical-address-lookup<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span><span class="Constant">1</span> <span class="Constant">0</span><span class="Special">))</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">list</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op lexical-address-lookup<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span><span class="Constant">0</span> <span class="Constant">0</span><span class="Special">))</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">cons</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
  <span class="Special">(</span><span class="PreProc">test</span> <span class="Special">(</span>op primitive-procedure?<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>branch <span class="Special">(</span>label primitive-branch5<span class="Special">))</span>
compiled-branch6
  <span class="Special">(</span>assign continue <span class="Special">(</span>label after-call7<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op compiled-procedure-entry<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>goto <span class="Special">(</span>reg val<span class="Special">))</span>
primitive-branch5
  <span class="Special">(</span>assign val <span class="Special">(</span>op apply-primitive-procedure<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
after-call7
  <span class="Special">(</span>restore env<span class="Special">)</span>
  <span class="Special">(</span>perform <span class="Special">(</span>op lexical-address-set!<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span><span class="Constant">0</span> <span class="Constant">0</span><span class="Special">))</span> <span class="Special">(</span>reg val<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>const ok<span class="Special">))</span>
  <span class="Special">(</span>restore continue<span class="Special">)</span>
  <span class="Special">(</span>save continue<span class="Special">)</span>
  <span class="Special">(</span>save env<span class="Special">)</span>
  <span class="Special">(</span>assign proc <span class="Special">(</span>op lookup-variable-value<span class="Special">)</span> <span class="Special">(</span>const <span class="Identifier">-</span><span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op lexical-address-lookup<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span><span class="Constant">1</span> <span class="Constant">1</span><span class="Special">))</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">list</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op lexical-address-lookup<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span><span class="Constant">0</span> <span class="Constant">1</span><span class="Special">))</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">cons</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
  <span class="Special">(</span><span class="PreProc">test</span> <span class="Special">(</span>op primitive-procedure?<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>branch <span class="Special">(</span>label primitive-branch8<span class="Special">))</span>
compiled-branch9
  <span class="Special">(</span>assign continue <span class="Special">(</span>label after-call10<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op compiled-procedure-entry<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>goto <span class="Special">(</span>reg val<span class="Special">))</span>
primitive-branch8
  <span class="Special">(</span>assign val <span class="Special">(</span>op apply-primitive-procedure<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
after-call10
  <span class="Special">(</span>restore env<span class="Special">)</span>
  <span class="Special">(</span>perform <span class="Special">(</span>op lexical-address-set!<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span><span class="Constant">0</span> <span class="Constant">1</span><span class="Special">))</span> <span class="Special">(</span>reg val<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>const ok<span class="Special">))</span>
  <span class="Special">(</span>restore continue<span class="Special">)</span>
  <span class="Special">(</span>assign proc <span class="Special">(</span>op lookup-variable-value<span class="Special">)</span> <span class="Special">(</span>const <span class="Identifier">*</span><span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op lexical-address-lookup<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span><span class="Constant">0</span> <span class="Constant">1</span><span class="Special">))</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">list</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op lexical-address-lookup<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span><span class="Constant">0</span> <span class="Constant">0</span><span class="Special">))</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">cons</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
  <span class="Special">(</span><span class="PreProc">test</span> <span class="Special">(</span>op primitive-procedure?<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>branch <span class="Special">(</span>label primitive-branch11<span class="Special">))</span>
compiled-branch12
  <span class="Special">(</span>assign val <span class="Special">(</span>op compiled-procedure-entry<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>goto <span class="Special">(</span>reg val<span class="Special">))</span>
primitive-branch11
  <span class="Special">(</span>assign val <span class="Special">(</span>op apply-primitive-procedure<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
  <span class="Special">(</span>goto <span class="Special">(</span>reg continue<span class="Special">))</span>
after-call13
after-lambda4
  <span class="Special">(</span>assign val <span class="Special">(</span>const <span class="Constant">*unassigned*</span><span class="Special">))</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">list</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>const <span class="Constant">*unassigned*</span><span class="Special">))</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">cons</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
  <span class="Special">(</span><span class="PreProc">test</span> <span class="Special">(</span>op primitive-procedure?<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>branch <span class="Special">(</span>label primitive-branch14<span class="Special">))</span>
compiled-branch15
  <span class="Special">(</span>assign val <span class="Special">(</span>op compiled-procedure-entry<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>goto <span class="Special">(</span>reg val<span class="Special">))</span>
primitive-branch14
  <span class="Special">(</span>assign val <span class="Special">(</span>op apply-primitive-procedure<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
  <span class="Special">(</span>goto <span class="Special">(</span>reg continue<span class="Special">))</span>
after-call16
after-lambda2
</pre>
<p>元の翻訳系での翻訳結果。</p>
<pre><span class="Special">(</span>env<span class="Special">)</span>
<span class="Special">(</span>val<span class="Special">)</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op make-compiled-procedure<span class="Special">)</span> <span class="Special">(</span>label entry1<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>goto <span class="Special">(</span>label after-lambda2<span class="Special">))</span>
entry1
  <span class="Special">(</span>assign env <span class="Special">(</span>op compiled-procedure-env<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>assign env <span class="Special">(</span>op extend-environment<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span>x y<span class="Special">))</span> <span class="Special">(</span>reg argl<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>save continue<span class="Special">)</span>
  <span class="Special">(</span>save env<span class="Special">)</span>
  <span class="Special">(</span>assign proc <span class="Special">(</span>op lookup-variable-value<span class="Special">)</span> <span class="Special">(</span>const <span class="Identifier">+</span><span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op lexical-address-lookup<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span><span class="Constant">0</span> <span class="Constant">0</span><span class="Special">))</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">list</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op lookup-variable-value<span class="Special">)</span> <span class="Special">(</span>const u<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">cons</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
  <span class="Special">(</span><span class="PreProc">test</span> <span class="Special">(</span>op primitive-procedure?<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>branch <span class="Special">(</span>label primitive-branch3<span class="Special">))</span>
compiled-branch4
  <span class="Special">(</span>assign continue <span class="Special">(</span>label after-call5<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op compiled-procedure-entry<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>goto <span class="Special">(</span>reg val<span class="Special">))</span>
primitive-branch3
  <span class="Special">(</span>assign val <span class="Special">(</span>op apply-primitive-procedure<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
after-call5
  <span class="Special">(</span>restore env<span class="Special">)</span>
  <span class="Special">(</span>perform <span class="Special">(</span>op define-variable!<span class="Special">)</span> <span class="Special">(</span>const u<span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>const ok<span class="Special">))</span>
  <span class="Special">(</span>restore continue<span class="Special">)</span>
  <span class="Special">(</span>save continue<span class="Special">)</span>
  <span class="Special">(</span>save env<span class="Special">)</span>
  <span class="Special">(</span>assign proc <span class="Special">(</span>op lookup-variable-value<span class="Special">)</span> <span class="Special">(</span>const <span class="Identifier">-</span><span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op lexical-address-lookup<span class="Special">)</span> <span class="Special">(</span>const <span class="Special">(</span><span class="Constant">0</span> <span class="Constant">1</span><span class="Special">))</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">list</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op lookup-variable-value<span class="Special">)</span> <span class="Special">(</span>const v<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">cons</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
  <span class="Special">(</span><span class="PreProc">test</span> <span class="Special">(</span>op primitive-procedure?<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>branch <span class="Special">(</span>label primitive-branch6<span class="Special">))</span>
compiled-branch7
  <span class="Special">(</span>assign continue <span class="Special">(</span>label after-call8<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op compiled-procedure-entry<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>goto <span class="Special">(</span>reg val<span class="Special">))</span>
primitive-branch6
  <span class="Special">(</span>assign val <span class="Special">(</span>op apply-primitive-procedure<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
after-call8
  <span class="Special">(</span>restore env<span class="Special">)</span>
  <span class="Special">(</span>perform <span class="Special">(</span>op define-variable!<span class="Special">)</span> <span class="Special">(</span>const v<span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>const ok<span class="Special">))</span>
  <span class="Special">(</span>restore continue<span class="Special">)</span>
  <span class="Special">(</span>assign proc <span class="Special">(</span>op lookup-variable-value<span class="Special">)</span> <span class="Special">(</span>const <span class="Identifier">*</span><span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op lookup-variable-value<span class="Special">)</span> <span class="Special">(</span>const v<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">list</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">))</span>
  <span class="Special">(</span>assign val <span class="Special">(</span>op lookup-variable-value<span class="Special">)</span> <span class="Special">(</span>const u<span class="Special">)</span> <span class="Special">(</span>reg env<span class="Special">))</span>
  <span class="Special">(</span>assign argl <span class="Special">(</span>op <span class="Identifier">cons</span><span class="Special">)</span> <span class="Special">(</span>reg val<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
  <span class="Special">(</span><span class="PreProc">test</span> <span class="Special">(</span>op primitive-procedure?<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>branch <span class="Special">(</span>label primitive-branch9<span class="Special">))</span>
compiled-branch10
  <span class="Special">(</span>assign val <span class="Special">(</span>op compiled-procedure-entry<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">))</span>
  <span class="Special">(</span>goto <span class="Special">(</span>reg val<span class="Special">))</span>
primitive-branch9
  <span class="Special">(</span>assign val <span class="Special">(</span>op apply-primitive-procedure<span class="Special">)</span> <span class="Special">(</span>reg proc<span class="Special">)</span> <span class="Special">(</span>reg argl<span class="Special">))</span>
  <span class="Special">(</span>goto <span class="Special">(</span>reg continue<span class="Special">))</span>
after-call11
after-lambda2
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:7pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51ZSMEJ9Y2L._SL160_.jpg" alt="計算機プログラムの構造と解釈" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-top:10px;margin-left:15px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">計算機プログラムの構造と解釈</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/489471163X/serendip7822-22/ref=nosim/" title="計算機プログラムの構造と解釈" target="_blank">amazlet</a> at 08.11.07</div>
</div>
<div class="amazlet-detail">ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン <br />ピアソンエデュケーション <br />売り上げランキング: 6542</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/3859/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

