<?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>リリカル☆Lisp開発日記</title>
	<atom:link href="http://blog.bugyo.tk/lyrical/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.bugyo.tk/lyrical</link>
	<description>リリカルでLispな開発日記</description>
	<lastBuildDate>Sun, 22 Aug 2010 08:31:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>次世代のリリカルLispを作るのはあなたです</title>
		<link>http://blog.bugyo.tk/lyrical/archives/666</link>
		<comments>http://blog.bugyo.tk/lyrical/archives/666#comments</comments>
		<pubDate>Sun, 22 Aug 2010 05:26:16 +0000</pubDate>
		<dc:creator>zick</dc:creator>
				<category><![CDATA[リリカル]]></category>

		<guid isPermaLink="false">http://blog.bugyo.tk/lyrical/?p=666</guid>
		<description><![CDATA[先日、COMFRK vol. 1を買いに来た方が
「リリカルLispは拡張したりしないんですか」
と質問されたそうです。
私にはもうリリカルLispのソースを触る元気は残っていません。
githubにソースを置いておいた [...]]]></description>
			<content:encoded><![CDATA[<p>先日、<a href="http://comfrk.info/">COMFRK vol. 1</a>を買いに来た方が<br />
「リリカルLispは拡張したりしないんですか」<br />
と質問されたそうです。</p>
<p>私にはもうリリカルLispのソースを触る元気は残っていません。<br />
githubにソースを置いておいたので、自由に改造して下さい。</p>
<p><a href="http://github.com/zick/Magical-Language-Lyrical-Lisp">http://github.com/zick/Magical-Language-Lyrical-Lisp</a></p>
<p><small>流行に乗ってgitとか使ってみたけど、さっぱりわかない。<br />
commitとpushってどう違うんだ。</small></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bugyo.tk/lyrical/archives/666/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[PrologでSchemeの操作的意味論を実装]Errata</title>
		<link>http://blog.bugyo.tk/lyrical/archives/659</link>
		<comments>http://blog.bugyo.tk/lyrical/archives/659#comments</comments>
		<pubDate>Sun, 15 Aug 2010 11:14:01 +0000</pubDate>
		<dc:creator>zick</dc:creator>
				<category><![CDATA[雑記]]></category>

		<guid isPermaLink="false">http://blog.bugyo.tk/lyrical/?p=659</guid>
		<description><![CDATA[昨日、無事完売しましたCOMFRK vol. 1の私の記事で
誤字を見つけたので書いておきます。
他に誤字を見つけた方がいましたら、コメントを残してもらえると助かります。
(5ページ目 右側 [おわりに])
- 誤: x [...]]]></description>
			<content:encoded><![CDATA[<p>昨日、無事完売しました<a href="http://comfrk.info/">COMFRK vol. 1</a>の私の記事で<br />
誤字を見つけたので書いておきます。<br />
他に誤字を見つけた方がいましたら、コメントを残してもらえると助かります。</p>
<p>(5ページ目 右側 [おわりに])<br />
- 誤: x=a+b<br />
- 正: x=a-b</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bugyo.tk/lyrical/archives/659/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[宣伝]COMFRK vol. 1</title>
		<link>http://blog.bugyo.tk/lyrical/archives/652</link>
		<comments>http://blog.bugyo.tk/lyrical/archives/652#comments</comments>
		<pubDate>Fri, 13 Aug 2010 15:13:53 +0000</pubDate>
		<dc:creator>zick</dc:creator>
				<category><![CDATA[雑記]]></category>

		<guid isPermaLink="false">http://blog.bugyo.tk/lyrical/?p=652</guid>
		<description><![CDATA[今更ながら、宣伝。

名前: COMFRK
日時: 8/14(土) 二日目
場所: 東ア47a
内容: 雑誌1部 COMFRK vol. 1
1. 夏休み子供λ相談室 by ranha
2. Haskellコミュニティ探 [...]]]></description>
			<content:encoded><![CDATA[<p>今更ながら、宣伝。</p>
<blockquote><p>
名前: COMFRK<br />
日時: 8/14(土) 二日目<br />
場所: 東ア47a<br />
内容: 雑誌1部 COMFRK vol. 1</p>
<p>1. 夏休み子供λ相談室 by ranha<br />
2. Haskellコミュニティ探訪 &#8211; 処理系とライブラリを中心にして &#8211; by shelarcy<br />
3. 差分のアルゴリズム by cubicdaiya<br />
4. メインメモリアクセスマニュアル by nish<br />
5. C++0xの空、Variadic Templatesの夏 by lyrical logical<br />
<b>6. PrologでSchemeの操作的意味論を実装 by zick</b><br />
7. ゲームオーバーのすゝめ by mascalade<br />
8. ???</p>
<p>(<a href="http://ratiwo.blogspot.com/2010/08/comfrk-vol-1.html">埒を明ける日々</a>)
</p></blockquote>
<p>という訳で<br />
「PrologでSchemeの操作的意味論を実装」<br />
という記事を書かせていただきました。<br />
本来は<a href="http://lambda.bugyo.tk/hatena/">はてなようせいとまなぶ Schemeの形式的意味論</a>に載せるつもりだった、<br />
Prologのソースコードの解説です。<br />
大体こんな感じの内容です。<br />
<a href="http://blog.bugyo.tk/lyrical/wp-content/uploads/2010/08/comfrk_sample.jpg"><img src="http://blog.bugyo.tk/lyrical/wp-content/uploads/2010/08/comfrk_sample_s.jpg"/></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bugyo.tk/lyrical/archives/652/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>式Mのxをyに置き換える</title>
		<link>http://blog.bugyo.tk/lyrical/archives/640</link>
		<comments>http://blog.bugyo.tk/lyrical/archives/640#comments</comments>
		<pubDate>Sat, 17 Jul 2010 06:57:36 +0000</pubDate>
		<dc:creator>zick</dc:creator>
				<category><![CDATA[雑記]]></category>

		<guid isPermaLink="false">http://blog.bugyo.tk/lyrical/?p=640</guid>
		<description><![CDATA[λ計算だとか、数学よりの話をするときはよく、

式Mのxをyに置き換えたものを
M[x:=y]
で表す．

なんて定義が出てきます。
本によっては、まったく同じことを表すのに、
[y/x]M
だとか、
M[y/x]
とい [...]]]></description>
			<content:encoded><![CDATA[<p>λ計算だとか、数学よりの話をするときはよく、</p>
<blockquote><p>
式Mのxをyに置き換えたものを<br />
<b>M[x:=y]</b><br />
で表す．
</p></blockquote>
<p>なんて定義が出てきます。<br />
本によっては、まったく同じことを表すのに、<br />
<b>[y/x]M</b><br />
だとか、<br />
<b>M[y/x]</b><br />
といった記法も使います。</p>
<p>本日、このM, x, yの順番に、意味がある(かもしれない)ことに唐突に気づきました。</p>
<blockquote><p>
式<font color="#ff4444"><b>M</b></font>の<font color="#44ff44"><b>x</b></font></a>を<font color="#4444ff"><b>y</b></font>に置き換える<br />
<font color="#ff4444"><b>M</b></font>[<font color="44ff44#"><b>x</b></font>:=<font color="#4444ff"><b>y</b></font>]
</p></blockquote>
<p>M[x:=y]は日本語表記と完全に一致するじゃないですか、<br />
なんか読み易いと思ったらそういうことか。</p>
<p>それから、[y/x]Mは英語だと意味をなします。</p>
<blockquote><p>
Substitute <font color="#ff4444"><b>y</b></font> for all <font color="#44ff44"><b>x</b></font></a> in <font color="#4444ff"><b>M</b></font>.<br />
[<font color="#ff4444"><b>y</b></font>/<font color="44ff44#"><b>x</b></font>]<font color="#4444ff"><b>M</b></font>
</p></blockquote>
<p>完全に一致。</p>
<p>しかし、そうなるとM[y/x]が浮いてしまうんですが、<br />
これには何か意味があるんでしょうか。<br />
謎です。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bugyo.tk/lyrical/archives/640/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>#+のちょっといい話</title>
		<link>http://blog.bugyo.tk/lyrical/archives/631</link>
		<comments>http://blog.bugyo.tk/lyrical/archives/631#comments</comments>
		<pubDate>Tue, 13 Jul 2010 11:34:05 +0000</pubDate>
		<dc:creator>zick</dc:creator>
				<category><![CDATA[プログラミング]]></category>

		<guid isPermaLink="false">http://blog.bugyo.tk/lyrical/?p=631</guid>
		<description><![CDATA[Lispでは式1個だけをコメントアウトしたいことがよくあります。

(list A B C)


このようなプログラムで、Bをコメントアウトするときに、
行コメントをつかうと非常に不格好になります。

(list A ; [...]]]></description>
			<content:encoded><![CDATA[<p>Lispでは式1個だけをコメントアウトしたいことがよくあります。</p>
<blockquote><pre>
(list A B C)
</pre>
</blockquote>
<p>このようなプログラムで、Bをコメントアウトするときに、<br />
行コメントをつかうと非常に不格好になります。</p>
<blockquote><pre>
(list A ;B
  C)
</pre>
</blockquote>
<p>ブロックコメントコメント <b>#| &#8230; |#</b> を使えばもう少し奇麗に書けますが、面倒です。</p>
<blockquote><pre>
(list A #|B|# C)
</pre>
</blockquote>
<p>Schemeの場合、R6RSで式コメントが書けるようになりました。</p>
<blockquote><pre>
(list A #;B C)
</pre>
</blockquote>
<p>非常に簡潔です。素晴らしい。</p>
<p>Common Lispで同じことをする場合、#+を使います。<br />
#+はCで言うところの#ifdefであり、環境に依存するコードを書くときによく使います。</p>
<blockquote><pre>
(defun do-something-quickly()
  #+allegro ACL専用の処理
  #+sbcl SBCL専用の処理
  #+clisp CLISP専用の処理
  #-(and allegro sbcl clisp) (error "Use ACL, SBCL or CLISP.")
)
</pre>
</blockquote>
<p><b>#+X Y</b>と書くと、(member X *features*)が真であれば、Yがリードされ、<br />
偽であればYは読み飛ばされます。<br />
*feature*に含まれないシンボルXをわざと書けば、式コメントが実現できます。</p>
<blockquote><pre>
;; 例1
(list A #+nil B C)
;; 例2
(list A #+ignore B C)
;; 例3
(list A #+comment B C)
</pre>
</blockquote>
<p>多くの場合、上の3つの例はうまく動いてくれますが、<br />
万が一、*feature*にnilやignoreやcommentが含まれている場合、Bがコメントアウトされません。</p>
<p>どうしたものかと思いつつ、ずっと #+nil を使い続けていたんですが、<br />
どんな環境でも確実にうまくいく方法を見つけました。</p>
<blockquote><pre>
(list A #+(or)B C)
</pre>
</blockquote>
<p>#+(or)です。<br />
<b>#+(or X Y &#8230;) Z</b>と書くと、<br />
(or (member X *features*) (member Y *features*) &#8230;)<br />
が真のときのみ、Zがリードされます。<br />
つまり、orに引数を与えなければZは常にリードされません。<br />
これで、*features*にnilが含まれていないか心配で眠れない夜ともおさらばです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bugyo.tk/lyrical/archives/631/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>##のわりとどうでもいい話</title>
		<link>http://blog.bugyo.tk/lyrical/archives/610</link>
		<comments>http://blog.bugyo.tk/lyrical/archives/610#comments</comments>
		<pubDate>Tue, 08 Jun 2010 03:41:56 +0000</pubDate>
		<dc:creator>zick</dc:creator>
				<category><![CDATA[プログラミング]]></category>

		<guid isPermaLink="false">http://blog.bugyo.tk/lyrical/?p=610</guid>
		<description><![CDATA[※リストの循環は脳に悪影響を及ぼす可能性があります。
　本エントリを読むときは必ず(setq *print-circle* t)を利用して下さい。
＜括弧を書かずに循環構造をつくろうとしたのがことの始まりでした＞

'# [...]]]></description>
			<content:encoded><![CDATA[<p><small><b>※リストの循環は脳に悪影響を及ぼす可能性があります。<br />
　本エントリを読むときは必ず(setq *print-circle* t)を利用して下さい。</b></small></p>
<p><b>＜括弧を書かずに循環構造をつくろうとしたのがことの始まりでした＞</b></p>
<blockquote><pre>
'#1='#1# => #1='#1#
</pre>
</blockquote>
<p>リーダマクロ &#8216; を展開すると結果は、 #1=(quote #1#) になり、循環構造ができます。<br />
しかし、CLISPでこれのcdrを取るとスタックオーバフローします。</p>
<blockquote><pre>
(cdr '#1='#1#)
*** - Program stack overflow. RESET
</pre>
</blockquote>
<p>ちなみに、SBCLだとちゃんと結果が表示されます。</p>
<blockquote><pre>
(cdr '#1='#1#) => (#1='#1#)
</pre>
</blockquote>
<p><b>＜ちゃんと！？＞</b><br />
よくよく見ると、微妙におかしなことに気づきました。<br />
#1=(quote #1#)は2個のコンスセルから構成されます。<br />
しかし、(#1=&#8217;#1#)は3個のコンスセルから構成されてるじゃないですか！<br />
(cdr &#8216;#1=&#8217;#1#)は#1=((quote . #1#))じゃないとおかしいはず(図参照)。<br />
<img src="http://blog.bugyo.tk/lyrical/wp-content/uploads/2010/06/K3400001.jpg" alt="" /></p>
<p><b>＜何かがおかしい＞</b><br />
もし(#1=&#8217;#1#)が図の右側のような構造で表されていた場合、<br />
(#1=&#8217;#1#)と(cdar (#1=&#8217;#1#))は別のものになるはずです。しかし、</p>
<blockquote><pre>
(defvar a (cdr '#1='#1#)) => A
a => (#1='#1#)
(eq a (cdar a)) => T
</pre>
</blockquote>
<p>同一のものと判定されてしまいました。<br />
しかし、</p>
<blockquote><pre>
(defvar b '(#1='#1#)) => B
(eq b (cdar b)) => NIL
</pre>
</blockquote>
<p>やっぱり同一じゃなかった！？<br />
つまり、ここから得られる結論は<br />
(#1=&#8217;#1#)は(#1=&#8217;#1#)であって(#1=&#8217;#1#)ではない、なんじゃそりゃ。</p>
<p><b>＜更なる謎＞</b><br />
CLISPで色々試していると更に訳の分からないことが起きました。</p>
<blockquote><pre>
(cdr '#1=(quote #1#))
*** - Program stack overflow. RESET
(cdr '#1=(q #1#)) => #1=((Q . #1#))
</pre>
</blockquote>
<p>quoteだと駄目で、qなら大丈夫！？<br />
シンボルが別のものになっただけで、なんで結果が変わるのでしょうか。</p>
<p><b>＜それでもGaucheなら・・・Gaucheならきっと何とかしてくれる＞</b><br />
もうCommon Lispの処理系に頼るのに嫌気がさして来たのでGaucheを使ってみました。</p>
<blockquote><pre>
'#1='#1# => #0='#0#
</pre>
</blockquote>
<p>Gaucheだと##は0から始まるみたいです。で、これのcdrをとると</p>
<blockquote><pre>
(cdr '#1='#1#) =>
#0=('''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''
(中略)
'''''''''''''''''''''''''''''''''''''''''''
Segmentation fault
</pre>
</blockquote>
<p>やたらと沢山の引用符が出た後に死んでしまいました。</p>
<p>ここまで来てやっとすべての謎が解けました。<br />
CLISPがスタックオーバフローを起こした原因は(恐らく)この引用符です。<br />
表示部分で(quote X)を&#8217;Xに変換する処理が素直であったために死んでしまったのでしょう。</p>
<p>一方、素直でない(?)SBCLは生き残ることに成功しましたが、<br />
(#1=&#8217;#1#)という表示と(#1=&#8217;#1#)という入力が別物になるという問題が生まれてしまいます。<br />
個人的には<a href="https://twitter.com/natsutan/status/15480207811">LispWorksの動作</a>が一番好きです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bugyo.tk/lyrical/archives/610/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>with-open-fileをC++/C99で</title>
		<link>http://blog.bugyo.tk/lyrical/archives/602</link>
		<comments>http://blog.bugyo.tk/lyrical/archives/602#comments</comments>
		<pubDate>Thu, 03 Jun 2010 13:03:03 +0000</pubDate>
		<dc:creator>zick</dc:creator>
				<category><![CDATA[プログラミング]]></category>

		<guid isPermaLink="false">http://blog.bugyo.tk/lyrical/?p=602</guid>
		<description><![CDATA[Common Lispにはwith-open-fileというマクロがあります。

(with-open-file (stream filename)
  ...
  (read-line s)
 ...
 )


このマ [...]]]></description>
			<content:encoded><![CDATA[<p>Common Lispにはwith-open-fileというマクロがあります。</p>
<blockquote><pre>
(with-open-file (stream filename)
  ...
  (read-line s)
 ...
 )
</pre>
</blockquote>
<p>このマクロは、ファイルをオープンして、<br />
ここを抜けるときに自動的にファイルをクローズしてくれるというものです。<br />
そのため、ファイルの閉じ忘れがおこりません。</p>
<p>このマクロをC++、もしくはC99で再現する方法を思いついたのでメモしておきます。</p>
<blockquote><pre>
#define with_open_file(s,p,m) \
  for(FILE *s=fopen(p,m); s; fclose(s),s=NULL)
...
void hoge(char *path) {
  char buf[256];
  with_open_file(fp, path, "r") {
    ...
    fgets(buf, sizeof(buf), fp);
    ...
  }
}
</pre>
</blockquote>
<p>短いコードでなかなかいい感じだと思います。<br />
残念ながら、本物のwith-open-fileと異なり、returnなどで関数を抜けたときに、<br />
ファイルを閉じてくれないという問題がありますが。<br />
(その他にも、breakやcontinueを中で使ったらまずいとか、色々あるけど、<br />
 まあ、一発ネタなんで、深いことは考えないことにします。)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bugyo.tk/lyrical/archives/602/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>マンガで分かるLisp [Section 3.4]</title>
		<link>http://blog.bugyo.tk/lyrical/archives/599</link>
		<comments>http://blog.bugyo.tk/lyrical/archives/599#comments</comments>
		<pubDate>Sat, 29 May 2010 11:26:00 +0000</pubDate>
		<dc:creator>zick</dc:creator>
				<category><![CDATA[マンガ]]></category>

		<guid isPermaLink="false">http://blog.bugyo.tk/lyrical/?p=599</guid>
		<description><![CDATA[またも前のエントリから1ヶ月が経過してました。

時間経つの早すぎ。
]]></description>
			<content:encoded><![CDATA[<p>またも前のエントリから1ヶ月が経過してました。<br />
<a href="http://lambda.bugyo.tk/cdr/mwl23/mwl23.html"><img src="http://lambda.bugyo.tk/cdr/mwl23/mwl_23s.png"alt=""></a><br />
時間経つの早すぎ。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bugyo.tk/lyrical/archives/599/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>マンガで分かるLisp [その12]</title>
		<link>http://blog.bugyo.tk/lyrical/archives/591</link>
		<comments>http://blog.bugyo.tk/lyrical/archives/591#comments</comments>
		<pubDate>Sat, 24 Apr 2010 10:02:00 +0000</pubDate>
		<dc:creator>zick</dc:creator>
				<category><![CDATA[マンガ]]></category>

		<guid isPermaLink="false">http://blog.bugyo.tk/lyrical/?p=591</guid>
		<description><![CDATA[みなさん、覚えていますか？

マンガで分かるLispは「Lispで世界を救う話」だったということを。
]]></description>
			<content:encoded><![CDATA[<p>みなさん、覚えていますか？<br />
<a href="http://lambda.bugyo.tk/cdr/mwl22/mwl22.html"><img src="http://lambda.bugyo.tk/cdr/mwl22/mwl_22s.png"alt=""></a><br />
マンガで分かるLispは「Lispで世界を救う話」だったということを。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bugyo.tk/lyrical/archives/591/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>マンガで分かるLisp [Section 3.3]</title>
		<link>http://blog.bugyo.tk/lyrical/archives/588</link>
		<comments>http://blog.bugyo.tk/lyrical/archives/588#comments</comments>
		<pubDate>Sat, 17 Apr 2010 04:05:32 +0000</pubDate>
		<dc:creator>zick</dc:creator>
				<category><![CDATA[マンガ]]></category>

		<guid isPermaLink="false">http://blog.bugyo.tk/lyrical/?p=588</guid>
		<description><![CDATA[気がついたら、1ヶ月以上更新が止まってました。

そして、気がついたら大学院生になってました。
]]></description>
			<content:encoded><![CDATA[<p>気がついたら、1ヶ月以上更新が止まってました。<br />
<a href="http://lambda.bugyo.tk/cdr/mwl21/mwl21.html"><img src="http://lambda.bugyo.tk/cdr/mwl21/mwl_21s.png"alt=""></a><br />
そして、気がついたら大学院生になってました。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bugyo.tk/lyrical/archives/588/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
