<?xml version="1.0" encoding="utf-8" ?>


<?xml-stylesheet href="/tkmr2000/rssxsl" type="text/xsl" media="screen"?>


<rdf:RDF
	xmlns="http://purl.org/rss/1.0/"
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xml:lang="ja">
<channel rdf:about="http://sicp.g.hatena.ne.jp/tkmr2000/rss">
	<title>SICP読書メモ</title>
	<link>http://sicp.g.hatena.ne.jp/tkmr2000/</link>
	<description>SICP読書メモ</description>

	<dc:creator>tkmr2000</dc:creator>
	<items>
	<rdf:Seq>
		<rdf:li rdf:resource="http://sicp.g.hatena.ne.jp/tkmr2000/20090707/1246933030"/>
		<rdf:li rdf:resource="http://sicp.g.hatena.ne.jp/tkmr2000/20090329/1238343748"/>
		<rdf:li rdf:resource="http://sicp.g.hatena.ne.jp/tkmr2000/20090329/1238343749"/>
		<rdf:li rdf:resource="http://sicp.g.hatena.ne.jp/tkmr2000/20090329/1238343750"/>
		<rdf:li rdf:resource="http://sicp.g.hatena.ne.jp/tkmr2000/20090329/1238343751"/>
		<rdf:li rdf:resource="http://sicp.g.hatena.ne.jp/tkmr2000/20090322/1237825798"/>
		<rdf:li rdf:resource="http://sicp.g.hatena.ne.jp/tkmr2000/20090314/1237649611"/>
	</rdf:Seq>
	</items>
</channel>
<item rdf:about="http://sicp.g.hatena.ne.jp/tkmr2000/20090707/1246933030">
	<title>３ヶ月ぶり</title>
	<link>http://sicp.g.hatena.ne.jp/tkmr2000/20090707/1246933030</link>
	<description> Real world haskell に浮気してて忘れてた http://book.realworldhaskell.org/read/index.html ３ヶ月放置だったのね、しまった・・ このまま放置すると後味悪いので、少しづつでも進めよう。 でも同じ関数型</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>Real world haskell に浮気してて忘れてた</p>
			<p><a href="http://book.realworldhaskell.org/read/index.html" target="_blank">http://book.realworldhaskell.org/read/index.html</a></p>
			<p>３ヶ月放置だったのね、しまった・・</p>
			<p>このまま放置すると後味悪いので、少しづつでも進めよう。</p>
			<p>でも同じ関数型言語でもLisp(Scheme)とhaskell違いがあっても面白いね</p>
			<p>やっぱ一番の差異は "型" の存在かな？</p>
			<p>型を安全で便利と思うか、俺様にはそんな安全装置不要だぜガンガンいくぜ、と思うかによってメリットにもなるし、デメリットにもなるし、オブジェクト指向でいうRubyとJava/C#の違いとか？</p>
			<p>でもhaskellは型推論があるから省略もできるし、型からのパターンマッチがずいぶん便利だし、そういう意味ではhaskellの型は一歩リードだよなぁ</p>
			<p>あとhaskellの方が参照透明性を大事にしてて頑固だよね、なんてったって純粋関数型言語だもんね。英語で言うと purely functional programming language で、名前にpureが付くなんて！頑固だなー</p>
		</div>
]]></content:encoded>

	<dc:creator>tkmr2000</dc:creator>
	<dc:date>2009-07-07T11:17:10+09:00</dc:date>
</item>
<item rdf:about="http://sicp.g.hatena.ne.jp/tkmr2000/20090329/1238343748">
	<title> 4.3.3 amb処理系の実装</title>
	<link>http://sicp.g.hatena.ne.jp/tkmr2000/20090329/1238343748</link>
	<description></description>

	<dc:creator>tkmr2000</dc:creator>
	<dc:date>2009-03-30T01:22:28+09:00</dc:date>
</item>
<item rdf:about="http://sicp.g.hatena.ne.jp/tkmr2000/20090329/1238343749">
	<title> 4.3.2 非決定性プログラムの例</title>
	<link>http://sicp.g.hatena.ne.jp/tkmr2000/20090329/1238343749</link>
	<description> 非決定性プログラムの例が山盛り。 が、実際に実行できないといまいち実感が湧かない、ということで4.3.3 で処理系を実装してから読む。 </description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>非決定性プログラムの例が山盛り。</p>
			<p>が、実際に実行できないといまいち実感が湧かない、ということで4.3.3 で処理系を実装してから読む。</p>
		</div>
]]></content:encoded>

	<dc:creator>tkmr2000</dc:creator>
	<dc:date>2009-03-30T01:22:29+09:00</dc:date>
</item>
<item rdf:about="http://sicp.g.hatena.ne.jp/tkmr2000/20090329/1238343750">
	<title> 4.3.1 非決定性計算 - ambと探索</title>
	<link>http://sicp.g.hatena.ne.jp/tkmr2000/20090329/1238343750</link>
	<description> 4.2の遅延評価に続いて、Scheme処理系に非決定性計算を組み込む。 二つの整数のリストから素数の組み合わせを探す時、通常の計算だとリストの組み合わせを全て作って、素数のペアを抜き</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>4.2の遅延評価に続いて、Scheme処理系に非決定性計算を組み込む。</p>
			<p>二つの整数のリストから素数の組み合わせを探す時、通常の計算だとリストの組み合わせを全て作って、素数のペアを抜き出す。</p>
			<p>遅延リストの場合、リストの組み合わせを最初に作らない（評価を遅延させる）、という点以外は同様。非決定性計算の場合、式が複数の値を取り得て、素数のペアを探索する処理は非決定性計算が組み込まれた処理系が処理する。等々、非決定性計算と遅延リストの比較等ありつつ、どう実装するかに触れていく。</p>
			<p>今回は ”深さ優先探索” というアプローチで実装していく、とのこと。</p>
		</div>
]]></content:encoded>

	<dc:creator>tkmr2000</dc:creator>
	<dc:date>2009-03-30T01:22:30+09:00</dc:date>
</item>
<item rdf:about="http://sicp.g.hatena.ne.jp/tkmr2000/20090329/1238343751">
	<title> 4.2.3 遅延リストとしてのストリーム</title>
	<link>http://sicp.g.hatena.ne.jp/tkmr2000/20090329/1238343751</link>
	<description> 遅延評価が組み込まれた処理系で、以前実装したストリームを再度試してみる。 以前はかなり回りくどい工夫をしたけど、今回は cons / car / cdr を合成手続きで定義して 遅延評価させるだけ</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>遅延評価が組み込まれた処理系で、以前実装したストリームを再度試してみる。</p>
			<p>以前はかなり回りくどい工夫をしたけど、今回は cons / car / cdr を合成手続きで定義して</p>
			<p>遅延評価させるだけで良い。</p>
<pre class="syntax-highlight">
   <span class="synSpecial">(</span>define <span class="synSpecial">(</span><span class="synStatement">cons</span> a b<span class="synSpecial">)</span>
     <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>x<span class="synSpecial">)</span> <span class="synSpecial">(</span>x a b<span class="synSpecial">)))</span>

   <span class="synSpecial">(</span>define <span class="synSpecial">(</span><span class="synStatement">car</span> pair<span class="synSpecial">)</span>
     <span class="synSpecial">(</span>pair <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>a b<span class="synSpecial">)</span> a<span class="synSpecial">)))</span>

   <span class="synSpecial">(</span>define <span class="synSpecial">(</span><span class="synStatement">cdr</span> pair<span class="synSpecial">)</span>
     <span class="synSpecial">(</span>pair <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>a b<span class="synSpecial">)</span> b<span class="synSpecial">)))</span>
</pre>

			<p>SICPの最初の頃出てきた、手続きで表現した対（とリスト）で実装。以前実験したストリーム演算、一通り試したら一応ちゃんと動いていた。</p>
			<p>但し今回はリスト＝ストリームなので、より自然に表現できる。</p>
<pre class="syntax-highlight">
   <span class="synComment">;;リストのn番目を表示（動作確認用）</span>
   <span class="synSpecial">(</span>define <span class="synSpecial">(</span>list-ref items n<span class="synSpecial">)</span>
     <span class="synSpecial">(</span><span class="synStatement">print</span> <span class="synSpecial">(</span><span class="synStatement">car</span> items<span class="synSpecial">))</span>
     <span class="synSpecial">(</span><span class="synStatement">if</span> <span class="synSpecial">(</span>&amp;#60<span class="synComment">; n 1)</span>
         <span class="synSpecial">(</span><span class="synStatement">car</span> items<span class="synSpecial">)</span>
         <span class="synSpecial">(</span>list-ref <span class="synSpecial">(</span><span class="synStatement">cdr</span> items<span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">-</span> n <span class="synConstant">1</span><span class="synSpecial">))))</span>

   <span class="synComment">;;リストをフィルタする</span>
   <span class="synSpecial">(</span>define <span class="synSpecial">(</span>list-filter p items<span class="synSpecial">)</span>
     <span class="synSpecial">(</span><span class="synStatement">if</span> <span class="synSpecial">(</span>p <span class="synSpecial">(</span><span class="synStatement">car</span> items<span class="synSpecial">))</span>
         <span class="synSpecial">(</span><span class="synStatement">cons</span> <span class="synSpecial">(</span><span class="synStatement">car</span> items<span class="synSpecial">)</span>
               <span class="synSpecial">(</span>list-filter p <span class="synSpecial">(</span><span class="synStatement">cdr</span> items<span class="synSpecial">)))</span>
         <span class="synSpecial">(</span>list-filter p <span class="synSpecial">(</span><span class="synStatement">cdr</span> items<span class="synSpecial">))))</span>

   <span class="synComment">;;map</span>
   <span class="synSpecial">(</span>define <span class="synSpecial">(</span>list-map proc items<span class="synSpecial">)</span>
     <span class="synSpecial">(</span><span class="synStatement">cons</span> <span class="synSpecial">(</span>proc <span class="synSpecial">(</span><span class="synStatement">car</span> items<span class="synSpecial">))</span>
           <span class="synSpecial">(</span>list-map proc <span class="synSpecial">(</span><span class="synStatement">cdr</span> items<span class="synSpecial">))))</span>

   <span class="synComment">;;複数のリストを引数に取り、それを引数の手続きで一つにするmap</span>
   <span class="synSpecial">(</span>define <span class="synSpecial">(</span>lists-map proc list1 list2<span class="synSpecial">)</span>
     <span class="synSpecial">(</span><span class="synStatement">cons</span> <span class="synSpecial">(</span>proc <span class="synSpecial">(</span><span class="synStatement">car</span> list1<span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">car</span> list2<span class="synSpecial">))</span>
           <span class="synSpecial">(</span>lists-map proc <span class="synSpecial">(</span><span class="synStatement">cdr</span> list1<span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">cdr</span> list2<span class="synSpecial">))))</span>

   <span class="synComment">;;list-mapを利用して、リストの乗算</span>
   <span class="synSpecial">(</span>define <span class="synSpecial">(</span>scale-lists items factor<span class="synSpecial">)</span>
     <span class="synSpecial">(</span>list-map <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>x<span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">*</span> x factor<span class="synSpecial">))</span> items<span class="synSpecial">))</span>

   <span class="synComment">;;lists-mapを利用して、リストの加算</span>
   <span class="synSpecial">(</span>define <span class="synSpecial">(</span>add-lists list1 list2<span class="synSpecial">)</span>
     <span class="synSpecial">(</span>lists-map <span class="synStatement">+</span> list1 list2<span class="synSpecial">))</span>

   <span class="synComment">;;無限に1が続くリスト</span>
   <span class="synSpecial">(</span>define ones
     <span class="synSpecial">(</span><span class="synStatement">cons</span> <span class="synConstant">1</span> ones<span class="synSpecial">))</span>

   <span class="synComment">;;整数 numbers は ones と numbers を加算したリスト</span>
   <span class="synComment">;; 1</span>
   <span class="synComment">;; 1 + (1)</span>
   <span class="synComment">;; 1 + (1 + 1)</span>
   <span class="synComment">;; 1 + (1 + 1 ....)</span>
   <span class="synSpecial">(</span>define numbers
     <span class="synSpecial">(</span><span class="synStatement">cons</span> <span class="synConstant">1</span> <span class="synSpecial">(</span>add-lists ones numbers<span class="synSpecial">)))</span>

   <span class="synComment">;;偶数 even-numbers は２で割りきれる整数</span>
   <span class="synSpecial">(</span>define even-numbers
     <span class="synSpecial">(</span>list-filter
       <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>x<span class="synSpecial">)</span> <span class="synSpecial">(</span>&amp;#60<span class="synComment">; (- x (* (/ x 2) 2)) 1))</span>
       numbers<span class="synSpecial">))</span>

   <span class="synSpecial">(</span>list-ref even-numbers <span class="synConstant">10</span><span class="synSpecial">)</span>

   <span class="synComment">;;フィボナッチ数列は、フィボナッチ数列と(cdr フィボナッチ数列)の加算リスト</span>
   <span class="synComment">;;</span>
   <span class="synSpecial">(</span>define fib-numbers
     <span class="synSpecial">(</span><span class="synStatement">cons</span> <span class="synConstant">1</span>
           <span class="synSpecial">(</span><span class="synStatement">cons</span> <span class="synConstant">1</span>
                 <span class="synSpecial">(</span>add-lists <span class="synSpecial">(</span><span class="synStatement">cdr</span> fib-numbers<span class="synSpecial">)</span>
                            fib-numbers<span class="synSpecial">))))</span>

   <span class="synSpecial">(</span>list-ref fib-numbers <span class="synConstant">10</span><span class="synSpecial">)</span>

   <span class="synComment">;;素数primesは、素数を判定するprime?手続きでフィルタした整数</span>
   <span class="synSpecial">(</span>define primes
     <span class="synSpecial">(</span>list-filter prime?
                  <span class="synSpecial">(</span>list-filter <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>n<span class="synSpecial">)(</span>&amp;#62<span class="synComment">; n 1)) numbers)))</span>

   <span class="synComment">;;素数を判定するprime?は、素数列primesで割り切れない整数の場合trueを返す</span>
   <span class="synSpecial">(</span>define <span class="synSpecial">(</span>prime? n<span class="synSpecial">)</span>
     <span class="synSpecial">(</span>define <span class="synSpecial">(</span>iter ps<span class="synSpecial">)</span>
       <span class="synSpecial">(</span><span class="synStatement">if</span> <span class="synSpecial">(</span>&amp;#62<span class="synComment">; (square (car ps)) n)</span>
           #t
           <span class="synSpecial">(</span><span class="synStatement">if</span> <span class="synSpecial">(</span>divisible? n <span class="synSpecial">(</span><span class="synStatement">car</span> ps<span class="synSpecial">))</span>
               #f
               <span class="synSpecial">(</span>iter <span class="synSpecial">(</span><span class="synStatement">cdr</span> ps<span class="synSpecial">)))))</span>
     <span class="synSpecial">(</span>iter primes<span class="synSpecial">))</span>

   <span class="synSpecial">(</span>list-ref primes <span class="synConstant">10</span><span class="synSpecial">)</span>

</pre>

		</div>
]]></content:encoded>

	<dc:creator>tkmr2000</dc:creator>
	<dc:date>2009-03-30T01:22:31+09:00</dc:date>
</item>
<item rdf:about="http://sicp.g.hatena.ne.jp/tkmr2000/20090322/1237825798">
	<title> 4.2 遅延評価</title>
	<link>http://sicp.g.hatena.ne.jp/tkmr2000/20090322/1237825798</link>
	<description> 4.2.1 正規順序と作用的順序 Schemeは作用的順序評価だけど，これまでに作った処理系に手を加えることで、正規順序評価 （遅延評価）を試す． 仕様としては ・基本手続きは作用的順序評価 </description>

	<content:encoded><![CDATA[
		<div class="section">
			<h4> 4.2.1 正規順序と作用的順序</h4>
			<p>Schemeは作用的順序評価だけど，これまでに作った処理系に手を加えることで、正規順序評価</p>
			<p>（遅延評価）を試す．</p>
			<p>仕様としては</p>
			<p>・基本手続きは作用的順序評価</p>
			<p>・合成手続き（lambda式）は正規順序評価</p>
			<p>下記の変更を加える</p>
			<p>・lambda式の評価時は，引数を遅延オブジェクトに変換するだけで評価は遅延させる．</p>
			<p>　- 遅延オブジェクト = (cons 実際の式 . 環境）</p>
			<p>・if式の条件部にあたる式は強制評価を行う．</p>
			<p>・基本手続きの評価時は、引数の強制評価を行う．</p>
			<p>　- 強制評価 = (eval 実際の式 環境)</p>
			<p>その名の通り、式の評価を必要になるまで遅延させる.</p>
			<p>意外に簡単</p>
<pre class="syntax-highlight">

<span class="synComment">;;問4.27 下記の式を遅延評価させるとどうなるか ;;;</span>
<span class="synSpecial">(</span>define <span class="synStatement">count</span> <span class="synConstant">1</span><span class="synSpecial">)</span>
<span class="synSpecial">(</span>define <span class="synSpecial">(</span>id x<span class="synSpecial">)</span>
  <span class="synSpecial">(</span><span class="synStatement">set</span>! <span class="synStatement">count</span> <span class="synSpecial">(</span><span class="synStatement">+</span> <span class="synStatement">count</span> <span class="synConstant">1</span><span class="synSpecial">))</span>
  x<span class="synSpecial">)</span>

<span class="synSpecial">(</span><span class="synStatement">print</span> <span class="synStatement">count</span><span class="synSpecial">)</span>
<span class="synSpecial">(</span>define w <span class="synSpecial">(</span>id <span class="synSpecial">(</span>id <span class="synConstant">10</span><span class="synSpecial">)))</span>
<span class="synSpecial">(</span><span class="synStatement">print</span> <span class="synStatement">count</span><span class="synSpecial">)</span>
<span class="synSpecial">(</span><span class="synStatement">print</span> w<span class="synSpecial">)</span>
<span class="synSpecial">(</span><span class="synStatement">print</span> <span class="synStatement">count</span><span class="synSpecial">)</span>

<span class="synConstant">1</span>
<span class="synConstant">2</span>
<span class="synConstant">10</span>
<span class="synConstant">3</span>

w が遅延オブジェクト（実体 <span class="synStatement">=</span>&amp;#<span class="synConstant">62</span><span class="synComment">; (id 10)) に束縛されるので</span>
評価される度に<span class="synSpecial">(</span>id x<span class="synSpecial">)</span>が実行される。のかな。

</pre>

		</div>
]]></content:encoded>

	<dc:creator>tkmr2000</dc:creator>
	<dc:date>2009-03-24T01:29:58+09:00</dc:date>
</item>
<item rdf:about="http://sicp.g.hatena.ne.jp/tkmr2000/20090314/1237649611">
	<title> 4.1.6 内部定義</title>
	<link>http://sicp.g.hatena.ne.jp/tkmr2000/20090314/1237649611</link>
	<description> 手続き内のdefine式による定義は、振る舞いとしては同時に評価されるべき？ ((lambda (n) (define a (+ b 10) (define b (- n 3)) (+ a b))) 10) という式があった時に、a定義中のbは - 定義はそれぞれ順番に処</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>手続き内のdefine式による定義は、振る舞いとしては同時に評価されるべき？</p>
<pre class="syntax-highlight">

<span class="synSpecial">((</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>n<span class="synSpecial">)</span>
  <span class="synSpecial">(</span>define a <span class="synSpecial">(</span><span class="synStatement">+</span> b <span class="synConstant">10</span><span class="synSpecial">)</span>
  <span class="synSpecial">(</span>define b <span class="synSpecial">(</span><span class="synStatement">-</span> n <span class="synConstant">3</span><span class="synSpecial">))</span>
  <span class="synSpecial">(</span><span class="synStatement">+</span> a b<span class="synSpecial">)))</span>
 <span class="synConstant">10</span><span class="synSpecial">)</span>

</pre>

			<p>という式があった時に、a定義中のbは</p>
			<p> - 定義はそれぞれ順番に処理されるので、未定義でエラーになる</p>
			<p> - 定義は同時に起こるべきなので 7 になり正常</p>
			<p>どっちが正しいかという問題4.19 、 確かに定義は同時に起こる</p>
			<p>っていう意見も正しい気がする。</p>
			<p>欄外のコラムでは「同時に起こるべきだけど、実装が難しいので現実的にはエラーかな」とある。</p>
			<p>define式をletrecに展開し、変数のスコープをはっきりさせる例もあった</p>
<pre class="syntax-highlight">

<span class="synSpecial">(</span>define a &amp;#60<span class="synComment">;exp1&amp;#62;)</span>
<span class="synSpecial">(</span>define b &amp;#60<span class="synComment">;exp2&amp;#62;)</span>
<span class="synSpecial">(</span>a <span class="synSpecial">(</span>b <span class="synConstant">123</span><span class="synSpecial">))</span>

</pre>

			<p>を</p>
<pre class="syntax-highlight">

<span class="synSpecial">(</span><span class="synStatement">let</span> <span class="synSpecial">((</span>a <span class="synStatement">null</span><span class="synSpecial">)</span> <span class="synSpecial">(</span>b <span class="synStatement">null</span><span class="synSpecial">))</span>
  <span class="synSpecial">(</span><span class="synStatement">set</span>! a &amp;#60<span class="synComment">;exp1&amp;#62;)</span>
  <span class="synSpecial">(</span><span class="synStatement">set</span>! b &amp;#60<span class="synComment">;exp2&amp;#62;)</span>
  <span class="synSpecial">(</span>a <span class="synSpecial">(</span>b <span class="synConstant">123</span><span class="synSpecial">)))</span>

</pre>

			<p>に変換すれば、exp1とexp2がそれぞれを参照できる。あと評価がlambda式等で遅延されてれば問題無い？</p>
<pre class="syntax-highlight">

<span class="synComment">;;問 4.20 letrecをletを利用したマクロで実装する ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>

<span class="synComment">;;let を lambda に展開する</span>
<span class="synSpecial">(</span>define-syntax <span class="synStatement">let</span>
  <span class="synSpecial">(</span>syntax-rules <span class="synSpecial">()</span>
    <span class="synSpecial">((</span><span class="synStatement">let</span> <span class="synSpecial">((</span>_k _v<span class="synSpecial">)</span> ...<span class="synSpecial">)</span> _b ...<span class="synSpecial">)</span>
     <span class="synSpecial">((</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>_k ...<span class="synSpecial">)</span> _b ...<span class="synSpecial">)</span> _v ...<span class="synSpecial">))))</span>

<span class="synComment">;;letrec を let と set! に展開する。局所変数の評価タイミングがset!時に変わるので</span>
<span class="synComment">;;相互に参照する場合等上手くいく、のかな。。</span>
<span class="synSpecial">(</span>define-syntax letrec
  <span class="synSpecial">(</span>syntax-rules <span class="synSpecial">()</span>
    <span class="synSpecial">((</span>letrec <span class="synSpecial">((</span>var1 init1<span class="synSpecial">))</span> body ...<span class="synSpecial">)</span>
     <span class="synSpecial">((</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>var1<span class="synSpecial">)</span>
        <span class="synSpecial">(</span><span class="synStatement">let</span> <span class="synSpecial">((</span>temp1 <span class="synConstant">&quot;undefined&quot;</span><span class="synSpecial">))</span>
          <span class="synSpecial">(</span><span class="synStatement">set</span>! temp1 var1<span class="synSpecial">)</span>
          body ...<span class="synSpecial">))</span> init1<span class="synSpecial">))</span>
    <span class="synSpecial">((</span>letrec <span class="synSpecial">((</span>var1 init1<span class="synSpecial">)</span> params ...<span class="synSpecial">)</span> body ...<span class="synSpecial">)</span>
     <span class="synSpecial">(</span>letrec <span class="synSpecial">(</span>params ...<span class="synSpecial">)</span>
       <span class="synSpecial">((</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>var1<span class="synSpecial">)</span>
          <span class="synSpecial">(</span><span class="synStatement">let</span> <span class="synSpecial">((</span>temp1 <span class="synConstant">&quot;undefined&quot;</span><span class="synSpecial">))</span>
            <span class="synSpecial">(</span><span class="synStatement">set</span>! temp1 var1<span class="synSpecial">)</span>
            body ...<span class="synSpecial">))</span> init1<span class="synSpecial">)))))</span>

<span class="synComment">;;問 4.21 lambdaだけで再帰手続きを実装する ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
<span class="synComment">;;defineを利用せず（無名関数で）再帰処理を行う</span>

<span class="synComment">;;define;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
<span class="synSpecial">(</span>define <span class="synSpecial">(</span>fact n<span class="synSpecial">)</span>
  <span class="synSpecial">(</span><span class="synStatement">if</span> <span class="synSpecial">(</span><span class="synStatement">=</span> n <span class="synConstant">1</span><span class="synSpecial">)</span>
      <span class="synConstant">1</span>
      <span class="synSpecial">(</span><span class="synStatement">*</span> n <span class="synSpecial">(</span>fact <span class="synSpecial">(</span><span class="synStatement">-</span> n <span class="synConstant">1</span><span class="synSpecial">)))))</span>

<span class="synSpecial">(</span>fact <span class="synConstant">10</span><span class="synSpecial">)</span>

<span class="synComment">;;lambda;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
<span class="synSpecial">((</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>n<span class="synSpecial">)</span>
   <span class="synSpecial">((</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>fact<span class="synSpecial">)</span>
      <span class="synSpecial">(</span>fact fact n<span class="synSpecial">))</span>
    <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>f k<span class="synSpecial">)</span>
      <span class="synSpecial">(</span><span class="synStatement">if</span> <span class="synSpecial">(</span><span class="synStatement">=</span> k <span class="synConstant">1</span><span class="synSpecial">)</span>
          <span class="synConstant">1</span>
          <span class="synSpecial">(</span><span class="synStatement">*</span> k <span class="synSpecial">(</span>f f <span class="synSpecial">(</span><span class="synStatement">-</span> k <span class="synConstant">1</span><span class="synSpecial">)))))))</span>
 <span class="synConstant">10</span><span class="synSpecial">)</span>

<span class="synComment">;;YCombinator化;;;;;;;;;;;;;;;;;;;;;;;;</span>
<span class="synComment">;;</span>
<span class="synComment">;;こんな形にしたい</span>
<span class="synSpecial">(</span>define fact-maker
  <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>proc<span class="synSpecial">)</span>
    <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>n<span class="synSpecial">)</span>
      <span class="synSpecial">(</span><span class="synStatement">if</span> <span class="synSpecial">(</span><span class="synStatement">=</span> n <span class="synConstant">1</span><span class="synSpecial">)</span>
          <span class="synConstant">1</span>
          <span class="synSpecial">(</span><span class="synStatement">*</span> n <span class="synSpecial">((</span>proc proc<span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">-</span> n <span class="synConstant">1</span><span class="synSpecial">)))))))</span>

<span class="synSpecial">(</span><span class="synStatement">print</span> <span class="synSpecial">((</span>fact-maker fact-maker<span class="synSpecial">)</span> <span class="synConstant">8</span><span class="synSpecial">))</span>

<span class="synComment">;;(proc proc) を追い出す</span>
<span class="synComment">;;((proc proc) 5) は ((lambda (arg)((proc proc) arg)) 5) と等価なので</span>
<span class="synSpecial">(</span>define fact-maker2
  <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>proc<span class="synSpecial">)</span>
    <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>n<span class="synSpecial">)</span>
      <span class="synSpecial">(</span><span class="synStatement">if</span> <span class="synSpecial">(</span><span class="synStatement">=</span> n <span class="synConstant">1</span><span class="synSpecial">)</span>
          <span class="synConstant">1</span>
          <span class="synSpecial">(</span><span class="synStatement">*</span> n
             <span class="synSpecial">((</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>arg<span class="synSpecial">)((</span>proc proc<span class="synSpecial">)</span> arg<span class="synSpecial">))</span>
               <span class="synSpecial">(</span><span class="synStatement">-</span> n <span class="synConstant">1</span><span class="synSpecial">)))))))</span>

<span class="synSpecial">(</span><span class="synStatement">print</span> <span class="synSpecial">((</span>fact-maker2 fact-maker2<span class="synSpecial">)</span> <span class="synConstant">8</span><span class="synSpecial">))</span>

<span class="synComment">;;(lambda (arg)((proc proc) arg)) を関数外に追い出す</span>
<span class="synSpecial">(</span>define fact-maker3
  <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>f<span class="synSpecial">)</span>
    <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>n<span class="synSpecial">)</span>
      <span class="synSpecial">(</span><span class="synStatement">if</span> <span class="synSpecial">(</span><span class="synStatement">=</span> n <span class="synConstant">1</span><span class="synSpecial">)</span>
          <span class="synConstant">1</span>
          <span class="synSpecial">(</span><span class="synStatement">*</span> n
             <span class="synSpecial">(</span>f <span class="synSpecial">(</span><span class="synStatement">-</span> n <span class="synConstant">1</span><span class="synSpecial">)))))))</span>

<span class="synComment">;;を再帰的に実行したい。。</span>
<span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>proc<span class="synSpecial">)</span>
  <span class="synSpecial">(</span>fact-maker3
   <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>arg<span class="synSpecial">)</span> <span class="synSpecial">((</span>proc proc<span class="synSpecial">)</span> arg<span class="synSpecial">))))</span>


<span class="synComment">;;factで利用したlambda式の使い方で</span>
<span class="synSpecial">((</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>proc<span class="synSpecial">)</span>
   <span class="synSpecial">(</span>fact-maker3
    <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>arg<span class="synSpecial">)</span> <span class="synSpecial">((</span>proc proc<span class="synSpecial">)</span> arg<span class="synSpecial">))))</span>
 <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>proc<span class="synSpecial">)</span>
   <span class="synSpecial">(</span>fact-maker3
    <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>arg<span class="synSpecial">)</span> <span class="synSpecial">((</span>proc proc<span class="synSpecial">)</span> arg<span class="synSpecial">)))))</span>


<span class="synComment">;;固有名を抜き出す</span>
<span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>f<span class="synSpecial">)</span>
  <span class="synSpecial">((</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>proc<span class="synSpecial">)</span>
     <span class="synSpecial">(</span>f <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>arg<span class="synSpecial">)</span> <span class="synSpecial">((</span>proc proc<span class="synSpecial">)</span> arg<span class="synSpecial">))))</span>
   <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>proc<span class="synSpecial">)</span>
     <span class="synSpecial">(</span>f <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>arg<span class="synSpecial">)</span> <span class="synSpecial">((</span>proc proc<span class="synSpecial">)</span> arg<span class="synSpecial">))))))</span>


<span class="synComment">;;試してみる</span>
<span class="synSpecial">(</span>define Y
  <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>f<span class="synSpecial">)</span>
    <span class="synSpecial">((</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>proc<span class="synSpecial">)</span>
       <span class="synSpecial">(</span>f <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>arg<span class="synSpecial">)</span> <span class="synSpecial">((</span>proc proc<span class="synSpecial">)</span> arg<span class="synSpecial">))))</span>
     <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>proc<span class="synSpecial">)</span>
       <span class="synSpecial">(</span>f <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>arg<span class="synSpecial">)</span> <span class="synSpecial">((</span>proc proc<span class="synSpecial">)</span> arg<span class="synSpecial">)))))))</span>

<span class="synComment">;;自分自身を受け取ることを期待する</span>
<span class="synSpecial">(</span>define fact_y
  <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>me<span class="synSpecial">)</span>
    <span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>n<span class="synSpecial">)</span>
      <span class="synSpecial">(</span><span class="synStatement">if</span> <span class="synSpecial">(</span><span class="synStatement">=</span> n <span class="synConstant">1</span><span class="synSpecial">)</span>
          <span class="synConstant">1</span>
          <span class="synSpecial">(</span><span class="synStatement">*</span> n <span class="synSpecial">(</span>me <span class="synSpecial">(</span><span class="synStatement">-</span> n <span class="synConstant">1</span><span class="synSpecial">)))))))</span>

<span class="synSpecial">(</span><span class="synStatement">print</span>
 <span class="synSpecial">((</span>Y fact_y<span class="synSpecial">)</span> <span class="synConstant">8</span><span class="synSpecial">))</span>

<span class="synComment">;;参考にしました。</span>
<span class="synComment">;;http://www.loveruby.net/ja/misc/ycombinator.html</span>

</pre>

			<p>lambda式だけで再帰手続きをする、は面白かった。</p>
			<p>なるほど、、自分自身を実行するために、引数に入れて続ければ良いのか。</p>
			<p>うーん、syntax-ruleを実装してて時間が掛かった。 "..." は単純な可変長引数のような物かと思ってたら、誤解してた</p>
			<p>もう少し高度なパターンマッチのシンボルだったのか。</p>
			<p>まだマクロ内と実行時のシンボルの衝突が解決できてない気がするけど、まあいいや。次に進もう。</p>
		</div>
]]></content:encoded>

	<dc:creator>tkmr2000</dc:creator>
	<dc:date>2009-03-22T00:33:31+09:00</dc:date>
</item>
</rdf:RDF>

