<?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>へびにっき &#187; Common Lisp</title>
	<atom:link href="http://wp.serpere.info/archives/category/programing/common-lisp/feed" rel="self" type="application/rss+xml" />
	<link>http://wp.serpere.info</link>
	<description>樹上で暮らすヘビのように生きたい</description>
	<lastBuildDate>Thu, 09 Feb 2012 11:35:51 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>SBCLのソースを解析する</title>
		<link>http://wp.serpere.info/archives/720</link>
		<comments>http://wp.serpere.info/archives/720#comments</comments>
		<pubDate>Fri, 21 Aug 2009 13:31:01 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Common Lisp]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=720</guid>
		<description><![CDATA[SBCLで使用可能なexternal-formatの話の続き。 結局 SB-IMPL::*external-formats* を見ればわかるということで解決はしたのだが、SBCLはそれ自体がLispで書かれているので、関数readを使ってソースファイルからLispフォームを読み出し、内容を解析することでexternal-formatの定義を抽出することができるのではないか、と思いついた。 結論から言うと、一応は可能だった。しかし想像していたよりもはるかに面倒くさかった。以下はその苦労の記録である（完全なコードは最後に載せてある）。 基本的な戦略 まずfindとgrepによる下調べで次のようなことが判明した。 external-formatは3種類のマクロで定義されている define-external-format define-external-format/variable-width define-multibyte-encoding その定義が含まれているのは以下のファイル群である src/code/fd-stream.lisp src/code/external-formats/*.lisp よってこれらのファイルを read で読んで、該当するマクロフォームからexternal-formatの名前部分を取り出していけば良いはずである。 &#40;defun external-format-definition-p &#40;form&#41; &#40;when &#40;listp form&#41; &#40;case &#40;first form&#41; &#40;&#40;define-external-format define-external-format/variable-width&#41; &#40;second form&#41;&#41; &#40;define-multibyte-encoding &#40;third form&#41;&#41; &#40;otherwise &#40;apply #'append &#40;mapcar #'external-format-definition-p form&#41;&#41;&#41;&#41;&#41;&#41; 障害1.リーダーマクロ 対象となるソースファイルの中には #! で始まる独自のリーダーマクロを使ったコードが含まれており、そのままではreadで読み込めなかった。このマクロの正体が分からず随分苦労したのだが、どうやら既存の処理系でSBCL自体をコンパイルするときに、#!+ および #!- という形式で、それぞれ #+ と #- に類似する機能を提供するためのものらしい（参考）。そういう特殊な役割を持ったマクロであるために、実行時に使うことはできないようだ（実装は src/cold/shebang.lisp の中にある sb-cold::shebang-reader だが、実行時には sb-cold [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F720%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22SBCL%E3%81%AE%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%92%E8%A7%A3%E6%9E%90%E3%81%99%E3%82%8B%22%20%7D);"></div>
<p><a href="http://wp.serpere.info/archives/704">SBCLで使用可能なexternal-format</a>の話の続き。</p>
<p>結局 SB-IMPL::*external-formats* を見ればわかるということで解決はしたのだが、SBCLはそれ自体がLispで書かれているので、関数readを使ってソースファイルからLispフォームを読み出し、内容を解析することでexternal-formatの定義を抽出することができるのではないか、と思いついた。</p>
<p>結論から言うと、一応は可能だった。しかし想像していたよりもはるかに面倒くさかった。以下はその苦労の記録である（完全なコードは最後に載せてある）。</p>
<h3>基本的な戦略</h3>
<p>まずfindとgrepによる下調べで次のようなことが判明した。</p>
<ul>
<li>external-formatは3種類のマクロで定義されている
<ul>
<li>define-external-format</li>
<li>define-external-format/variable-width</li>
<li>define-multibyte-encoding</li>
</ul>
</li>
<li>その定義が含まれているのは以下のファイル群である
<ul>
<li>src/code/fd-stream.lisp</li>
<li>src/code/external-formats/*.lisp</li>
</ul>
</li>
</ul>
<p>よってこれらのファイルを read で読んで、該当するマクロフォームからexternal-formatの名前部分を取り出していけば良いはずである。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> external-format-definition-p <span style="color: #66cc66;">&#40;</span>form<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">listp</span> form<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">case</span> <span style="color: #66cc66;">&#40;</span>first form<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>define-external-format define-external-format/variable-width<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>second form<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>define-multibyte-encoding <span style="color: #66cc66;">&#40;</span>third form<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>otherwise <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span> #'<span style="color: #b1b100;">append</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">mapcar</span> #'external-format-definition-p form<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>



<h3>障害1.リーダーマクロ</h3>
<p>対象となるソースファイルの中には #! で始まる独自のリーダーマクロを使ったコードが含まれており、そのままではreadで読み込めなかった。このマクロの正体が分からず随分苦労したのだが、どうやら既存の処理系でSBCL自体をコンパイルするときに、#!+ および #!- という形式で、それぞれ #+ と #- に類似する機能を提供するためのものらしい（<a href="http://www.doc.gold.ac.uk/~mas01cr/papers/s32008/sbcl.pdf">参考</a>）。そういう特殊な役割を持ったマクロであるために、実行時に使うことはできないようだ（実装は src/cold/shebang.lisp の中にある sb-cold::shebang-reader だが、実行時には sb-cold パッケージは存在しない）。</p>
<p>単純に #! を無視するだけのリーダーマクロでは現在の環境で動かないコードまで読まれてエラーになったので、#+ および #- の実装に処理を転送することにして、どうにか動くようにした。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> shebang-reader <span style="color: #66cc66;">&#40;</span>stream sub-character infix-parameter<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>next-char <span style="color: #66cc66;">&#40;</span>read-char stream<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">funcall</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>char<span style="color: #66cc66;">=</span> next-char #\+<span style="color: #66cc66;">&#41;</span> #'sb-impl<span style="color: #66cc66;">::</span><span style="color: #555;">sharp-plus</span> #'sb-impl<span style="color: #66cc66;">::</span><span style="color: #555;">sharp-minus</span><span style="color: #66cc66;">&#41;</span>
	     stream sub-character infix-parameter<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>values<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>



<h3>障害2.パッケージ参照</h3>
<p>read は、読み出したLispフォームに存在しないパッケージへの参照が含まれているとエラーを起こす。</p>
<p>ところがSBCLのソース中には、ソース中の表記（SBCLのコンパイル中に使われる名前？）と実行時の名前が異なるというパッケージが存在することが分かった。例えばSB!IMPL（動作中はSB-IMPL）、SB!THREAD（動作中はSB-THREAD）などである。</p>
<p>ソースを注意深く読み、試行錯誤を繰り返した結果、sb-impl::bootstrap-package-not-found エラーに対し sb-impl::debootstrap-package 再起動を行ってやれば、これらのパッケージをソース中に表記された名前で参照できるということが分かった。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defmacro</span> with-debootstrap-package <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>body body<span style="color: #66cc66;">&#41;</span>
  `<span style="color: #66cc66;">&#40;</span>handler-bind <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>sb-impl<span style="color: #66cc66;">::</span><span style="color: #555;">bootstrap-package-not-found</span>
		   #'sb-impl<span style="color: #66cc66;">::</span><span style="color: #555;">debootstrap-package</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">,</span>@body<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>



<p>例：</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>with-debootstrap-package <span style="color: #66cc66;">&#40;</span>find-package <span style="color: #ff0000;">&quot;SB!IMPL&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">; =&gt; #&lt;PACKAGE &quot;SB-IMPL&quot;&gt;</span></pre></div></div>



<p>……</p>
<p>以上の障害（本当はもっといろいろあるが）を乗り越え、ようやく意図通りの動作をするようになった。以下に全コードを載せておく。しかしexportされていないシンボルを使いまくっているので、バージョンが違うと動かない可能性がある（sbcl-1.0.23-x86-darwin で動作確認）。もちろん、SBCLでしか動かない。</p>
<p><span id="more-720"></span></p>
<p>『実践Common Lisp』15章のライブラリを使っている。</p>
<p><script src="http://gist.github.com/171994.js"></script></p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/720/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SBCLで使用可能なexternal-format</title>
		<link>http://wp.serpere.info/archives/704</link>
		<comments>http://wp.serpere.info/archives/704#comments</comments>
		<pubDate>Sun, 16 Aug 2009 08:40:16 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Common Lisp]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=704</guid>
		<description><![CDATA[マニュアルに載ってなくて悩んでいたが、ソースを読めば良いだけだと気が付いた。external-format 関連のコードは src/code/fd-stream.lisp にあり、*external-formats* 変数に必要なデータが収められている。sbcl-1.0.30で全ての名前を表示すると次のようになる。 &#40;mapcar #'caar SB-IMPL::*external-formats*&#41; ;; =&#62; &#40;:UCS-2BE :UCS-2LE :SHIFT_JIS :EUC-JP :GBK :CP1258 :CP1257 :CP1256 :CP1255 :CP1254 :CP1253 :CP1252 :CP1251 :CP1250 :ISO-8859-14 :ISO-8859-13 :ISO-8859-11 :ISO-8859-10 :ISO-8859-9 :ISO-8859-8 :ISO-8859-7 :ISO-8859-6 :ISO-8859-5 :ISO-8859-4 :ISO-8859-3 :ISO-8859-2 :CP874 :CP869 :CP866 :CP865 :CP864 :CP863 :CP862 :CP861 :CP860 :CP857 :CP855 :CP852 :CP850 :CP437 :X-MAC-CYRILLIC :KOI8-U :KOI8-R :UTF-8 :LATIN-9 [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F704%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22SBCL%E3%81%A7%E4%BD%BF%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%AAexternal-format%22%20%7D);"></div>
<p><a href="http://wp.serpere.info/archives/701">マニュアルに載ってなくて</a>悩んでいたが、ソースを読めば良いだけだと気が付いた。external-format 関連のコードは src/code/fd-stream.lisp にあり、*external-formats* 変数に必要なデータが収められている。sbcl-1.0.30で全ての名前を表示すると次のようになる。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">mapcar</span> #'<span style="color: #b1b100;">caar</span> SB-IMPL<span style="color: #66cc66;">::</span>*external-formats*<span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;; =&gt;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">UCS-2BE</span> <span style="color: #66cc66;">:</span><span style="color: #555;">UCS-2LE</span> <span style="color: #66cc66;">:</span><span style="color: #555;">SHIFT_JIS</span> <span style="color: #66cc66;">:</span><span style="color: #555;">EUC-JP</span> <span style="color: #66cc66;">:</span><span style="color: #555;">GBK</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP1258</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP1257</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP1256</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP1255</span>
 <span style="color: #66cc66;">:</span><span style="color: #555;">CP1254</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP1253</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP1252</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP1251</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP1250</span> <span style="color: #66cc66;">:</span><span style="color: #555;">ISO-</span><span style="color: #cc66cc;">8859</span>-<span style="color: #cc66cc;">14</span> <span style="color: #66cc66;">:</span><span style="color: #555;">ISO-</span><span style="color: #cc66cc;">8859</span>-<span style="color: #cc66cc;">13</span> <span style="color: #66cc66;">:</span><span style="color: #555;">ISO-</span><span style="color: #cc66cc;">8859</span>-<span style="color: #cc66cc;">11</span>
 <span style="color: #66cc66;">:</span><span style="color: #555;">ISO-</span><span style="color: #cc66cc;">8859</span>-<span style="color: #cc66cc;">10</span> <span style="color: #66cc66;">:</span><span style="color: #555;">ISO-</span><span style="color: #cc66cc;">8859</span>-<span style="color: #cc66cc;">9</span> <span style="color: #66cc66;">:</span><span style="color: #555;">ISO-</span><span style="color: #cc66cc;">8859</span>-<span style="color: #cc66cc;">8</span> <span style="color: #66cc66;">:</span><span style="color: #555;">ISO-</span><span style="color: #cc66cc;">8859</span>-<span style="color: #cc66cc;">7</span> <span style="color: #66cc66;">:</span><span style="color: #555;">ISO-</span><span style="color: #cc66cc;">8859</span>-<span style="color: #cc66cc;">6</span> <span style="color: #66cc66;">:</span><span style="color: #555;">ISO-</span><span style="color: #cc66cc;">8859</span>-<span style="color: #cc66cc;">5</span>
 <span style="color: #66cc66;">:</span><span style="color: #555;">ISO-</span><span style="color: #cc66cc;">8859</span>-<span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">:</span><span style="color: #555;">ISO-</span><span style="color: #cc66cc;">8859</span>-<span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">:</span><span style="color: #555;">ISO-</span><span style="color: #cc66cc;">8859</span>-<span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP874</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP869</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP866</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP865</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP864</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP863</span>
 <span style="color: #66cc66;">:</span><span style="color: #555;">CP862</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP861</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP860</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP857</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP855</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP852</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP850</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP437</span> <span style="color: #66cc66;">:</span><span style="color: #555;">X-MAC-CYRILLIC</span>
 <span style="color: #66cc66;">:</span><span style="color: #555;">KOI8-U</span> <span style="color: #66cc66;">:</span><span style="color: #555;">KOI8-R</span> <span style="color: #66cc66;">:</span><span style="color: #555;">UTF-</span><span style="color: #cc66cc;">8</span> <span style="color: #66cc66;">:</span><span style="color: #555;">LATIN-</span><span style="color: #cc66cc;">9</span> <span style="color: #66cc66;">:</span><span style="color: #555;">EBCDIC-US</span> <span style="color: #66cc66;">:</span><span style="color: #555;">ASCII</span> <span style="color: #66cc66;">:</span><span style="color: #555;">LATIN-</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span></pre></div></div>



<p>別名も含め一覧表示する場合は</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">mapcar</span> #'first SB-IMPL<span style="color: #66cc66;">::</span>*external-formats*<span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;; =&gt;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">UCS-2BE</span> <span style="color: #66cc66;">:</span><span style="color: #555;">UCS2BE</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">UCS-2LE</span> <span style="color: #66cc66;">:</span><span style="color: #555;">UCS2LE</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">SHIFT_JIS</span> <span style="color: #66cc66;">:</span><span style="color: #555;">SJIS</span> <span style="color: #66cc66;">:|</span>Shift_JIS<span style="color: #66cc66;">|</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP932</span><span style="color: #66cc66;">&#41;</span>
 <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">EUC-JP</span> <span style="color: #66cc66;">:</span><span style="color: #555;">EUCJP</span> <span style="color: #66cc66;">:|</span>eucJP<span style="color: #66cc66;">|</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">GBK</span> <span style="color: #66cc66;">:</span><span style="color: #555;">CP936</span><span style="color: #66cc66;">&#41;</span>
 <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">CP1258</span> <span style="color: #66cc66;">:|</span>cp1258<span style="color: #66cc66;">|</span> <span style="color: #66cc66;">:</span><span style="color: #555;">WINDOWS-</span><span style="color: #cc66cc;">1258</span> <span style="color: #66cc66;">:|</span>windows-<span style="color: #cc66cc;">1258</span><span style="color: #66cc66;">|</span><span style="color: #66cc66;">&#41;</span>
 <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">CP1257</span> <span style="color: #66cc66;">:|</span>cp1257<span style="color: #66cc66;">|</span> <span style="color: #66cc66;">:</span><span style="color: #555;">WINDOWS-</span><span style="color: #cc66cc;">1257</span> <span style="color: #66cc66;">:|</span>windows-<span style="color: #cc66cc;">1257</span><span style="color: #66cc66;">|</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">CP1256</span> <span style="color: #66cc66;">:|</span>cp1256<span style="color: #66cc66;">|</span><span style="color: #66cc66;">&#41;</span>
 <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">CP1255</span> <span style="color: #66cc66;">:|</span>cp1255<span style="color: #66cc66;">|</span> <span style="color: #66cc66;">:</span><span style="color: #555;">WINDOWS-</span><span style="color: #cc66cc;">1255</span> <span style="color: #66cc66;">:|</span>windows-<span style="color: #cc66cc;">1255</span><span style="color: #66cc66;">|</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">CP1254</span> <span style="color: #66cc66;">:|</span>cp1254<span style="color: #66cc66;">|</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;... 長くなるので省略 ...</span></pre></div></div>




]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/704/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>『実践Common Lisp』23章</title>
		<link>http://wp.serpere.info/archives/701</link>
		<comments>http://wp.serpere.info/archives/701#comments</comments>
		<pubDate>Sat, 15 Aug 2009 06:06:11 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Common Lisp]]></category>
		<category><![CDATA[『実践Common Lisp』]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=701</guid>
		<description><![CDATA[293ページ脚注に載っているURLはリンク切れになっている。SpamAssassinが提供するSPAMとHAMのコーパスはここ。 ただし本に載っている通りのコードでは start-of-file でエラーが出た。環境はSBCL@MacOS X。コーパスの中にiso-8859-1でエンコードされたファイルが混じっているのが原因らしい。with-open-file に :external-format を指定したら動作した。 &#40;defun start-of-file &#40;file max-chars&#41; &#40;with-open-file &#40;in file :external-format :latin1&#41; &#40;let* &#40;&#40;length &#40;min &#40;file-length in&#41; max-chars&#41;&#41; &#40;text &#40;make-string length&#41;&#41; &#40;read &#40;read-sequence text in&#41;&#41;&#41; &#40;if &#40;&#60; read length&#41; &#40;subseq text 0 read&#41; text&#41;&#41;&#41;&#41; SBCLで使用可能な :exteral-format の一覧を探しているのだが、マニュアルのどこに書いてあるのか分からない…。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F701%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%E3%80%8E%E5%AE%9F%E8%B7%B5Common%20Lisp%E3%80%8F23%E7%AB%A0%22%20%7D);"></div>
<p>293ページ脚注に載っているURLはリンク切れになっている。SpamAssassinが提供するSPAMとHAMのコーパスは<a href="http://spamassassin.apache.org/publiccorpus/">ここ</a>。</p>
<p>ただし本に載っている通りのコードでは start-of-file でエラーが出た。環境はSBCL@MacOS X。コーパスの中にiso-8859-1でエンコードされたファイルが混じっているのが原因らしい。with-open-file に :external-format を指定したら動作した。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> start-of-file <span style="color: #66cc66;">&#40;</span>file max-chars<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>with-open-file <span style="color: #66cc66;">&#40;</span>in file <span style="color: #66cc66;">:</span><span style="color: #555;">external-format</span> <span style="color: #66cc66;">:</span><span style="color: #555;">latin1</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span>* <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">length</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">min</span> <span style="color: #66cc66;">&#40;</span>file-<span style="color: #b1b100;">length</span> in<span style="color: #66cc66;">&#41;</span> max-chars<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	   <span style="color: #66cc66;">&#40;</span>text <span style="color: #66cc66;">&#40;</span>make-string <span style="color: #b1b100;">length</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	   <span style="color: #66cc66;">&#40;</span>read <span style="color: #66cc66;">&#40;</span>read-sequence text in<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&lt;</span> read <span style="color: #b1b100;">length</span><span style="color: #66cc66;">&#41;</span>
	  <span style="color: #66cc66;">&#40;</span>subseq text <span style="color: #cc66cc;">0</span> read<span style="color: #66cc66;">&#41;</span>
	  text<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>



<p>SBCLで使用可能な :exteral-format の一覧を探しているのだが、<a href="http://www.sbcl.org/manual/">マニュアル</a>のどこに書いてあるのか分からない…。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/701/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>『実践Common Lisp』23.2 リスト指示子？</title>
		<link>http://wp.serpere.info/archives/683</link>
		<comments>http://wp.serpere.info/archives/683#comments</comments>
		<pubDate>Sun, 09 Aug 2009 09:00:04 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Common Lisp]]></category>
		<category><![CDATA[『実践Common Lisp』]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=683</guid>
		<description><![CDATA[『実践Common Lisp』286ページの脚注8、リスト指示子についての説明（翻訳）が完全に混乱していて、全く理解できない。 HyperSpecを参照しながら、自分なりに読み解いてみた。 1.4.1.5 Designators 本書で「指示子」と訳されている designator とは、別のオブジェクトを意味する/指し示すオブジェクトである。例えば format 関数の最初のパラメータに t を与えると *terminal-io* を与えたのと同じことになるが、これは t というシンボル・オブジェクトが *terminal-io* に保持されるストリーム・オブジェクトを意味する/指し示すからだ、と言うことができる。 あるオブジェクトがどのオブジェクトを指し示すかというルールは、指示子の型によって決められている。だから指示子は普通、型名を伴って &#60;&#60;type&#62;&#62; designator : 〜型の指示子 designator for a &#60;&#60;type&#62;&#62; : 〜型に対する指示子 とかいう呼び方をする（訳語は私による）。例えばシンボル t が *terminal-io* を指し示すというルールは stream desinator によって決められている。 …… 『実践Common Lisp』286ページ脚注に戻ると、ecase のキーは &#8220;designator for a list of objects&#8221; と定義されている。そこでHyperSpecの用語集で list designator のところを読むと、次のようなルールが書いてある。 nilではないアトム -> そのアトムを唯一の要素として持つリストを指し示す 普通のリスト [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F683%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%E3%80%8E%E5%AE%9F%E8%B7%B5Common%20Lisp%E3%80%8F23.2%20%E3%83%AA%E3%82%B9%E3%83%88%E6%8C%87%E7%A4%BA%E5%AD%90%EF%BC%9F%22%20%7D);"></div>
<p>『実践Common Lisp』286ページの脚注8、リスト指示子についての説明（翻訳）が完全に混乱していて、全く理解できない。</p>
<p>HyperSpecを参照しながら、自分なりに読み解いてみた。</p>
<p><a href="http://www.lispworks.com/documentation/HyperSpec/Body/01_dae.htm">1.4.1.5 Designators</a></p>
<p>本書で「指示子」と訳されている designator とは、別のオブジェクトを意味する/指し示すオブジェクトである。例えば format 関数の最初のパラメータに t を与えると *terminal-io* を与えたのと同じことになるが、これは t というシンボル・オブジェクトが *terminal-io* に保持されるストリーム・オブジェクトを意味する/指し示すからだ、と言うことができる。</p>
<p>あるオブジェクトがどのオブジェクトを指し示すかというルールは、指示子の型によって決められている。だから指示子は普通、型名を伴って</p>
<ul>
<li>&lt;&lt;type&gt;&gt; designator : 〜型の指示子</li>
<li>designator for a &lt;&lt;type&gt;&gt; : 〜型に対する指示子</li>
</ul>
<p>とかいう呼び方をする（訳語は私による）。例えばシンボル t が *terminal-io* を指し示すというルールは <a href="http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_s.htm#stream_designator">stream desinator</a> によって決められている。</p>
<p>……</p>
<p>『実践Common Lisp』286ページ脚注に戻ると、<a href="http://www.lispworks.com/documentation/HyperSpec/Body/m_case_.htm">ecase</a> のキーは &#8220;designator for a list of objects&#8221; と定義されている。そこでHyperSpecの用語集で <a href="http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_l.htm#list_designator">list designator</a> のところを読むと、次のようなルールが書いてある。</p>
<ul>
<li>nilではないアトム -> そのアトムを唯一の要素として持つリストを指し示す</li>
<li>普通のリスト -> そのリスト自身を指し示す</li>
</ul>
<p>つまり指定できるのは「nilではないアトム」か「リスト」のどちらかで、どちらを指定したとしてもリストと見なされる。</p>
<p>よって ecase の動作もキーがリストであることを前提として説明される。</p>
<blockquote><p>
If the test-key is the same as any key for that clause, the forms in that clause are evaluated as an implicit progn, and the values it returns are returned as the value of the case, ccase, or ecase form.
</p></blockquote>
<p>（そもそもこの短い脚注で指定子の概念にまで言及したせいで、翻訳も混乱してしまったのではないかと思う。『ecaseのキーにはリストも指定できる。リストを指定した場合はいずれかの要素が一致する場合にマッチしたと見なされる』くらいの言い方で良かったのではなかろうか…）</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/683/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Common Lispシンボルについての覚書</title>
		<link>http://wp.serpere.info/archives/671</link>
		<comments>http://wp.serpere.info/archives/671#comments</comments>
		<pubDate>Sun, 02 Aug 2009 05:51:56 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Common Lisp]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=671</guid>
		<description><![CDATA[シンボルはパッケージや「名前」に従属する存在ではなく、独立した実体を備えたオブジェクトである。 例えば以下のコードでは同じ名前を持つ2つの異なるシンボルを作っている。 &#40;let &#40;&#40;sym1 &#40;make-symbol &#34;name&#34;&#41;&#41; &#40;sym2 &#40;make-symbol &#34;name&#34;&#41;&#41;&#41; &#40;values &#40;string= &#40;symbol-name sym1&#41; &#40;symbol-name sym2&#41;&#41; &#40;eq sym1 sym2&#41;&#41;&#41; ;; =&#62; T NIL これは他のオブジェクト、例えば文字列を make-array で作る場合と、質的には何ら変わりない。 &#40;let &#40;&#40;str1 &#40;make-array 4 :element-type 'character :initial-element #\a&#41;&#41; &#40;str2 &#40;make-array 4 :element-type 'character :initial-element #\a&#41;&#41;&#41; &#40;values &#40;string= str1 str2&#41; &#40;eq str1 str2&#41;&#41;&#41; ;; =&#62; T NIL パッケージによるオブジェクト同一性の保証 シンボルは単なるオブジェクトなので、「『同じ名前』に対しては常に同じオブジェクトが割り当てられる」という、まさにシンボルがシンボルたる性質は、実はパッケージ・システムによって実現されている。 &#40;let &#40;&#40;sym1 [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F671%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Common%20Lisp%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E8%A6%9A%E6%9B%B8%22%20%7D);"></div>
<p>シンボルはパッケージや「名前」に従属する存在ではなく、独立した実体を備えたオブジェクトである。</p>
<p>例えば以下のコードでは同じ名前を持つ2つの異なるシンボルを作っている。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>sym1 <span style="color: #66cc66;">&#40;</span>make-<span style="color: #b1b100;">symbol</span> <span style="color: #ff0000;">&quot;name&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>sym2 <span style="color: #66cc66;">&#40;</span>make-<span style="color: #b1b100;">symbol</span> <span style="color: #ff0000;">&quot;name&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>values <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span>symbol-<span style="color: #b1b100;">name</span> sym1<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>symbol-<span style="color: #b1b100;">name</span> sym2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eq</span> sym1 sym2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;; =&gt; T NIL</span></pre></div></div>



<p>これは他のオブジェクト、例えば文字列を make-array で作る場合と、質的には何ら変わりない。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>str1 <span style="color: #66cc66;">&#40;</span>make-<span style="color: #b1b100;">array</span> <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">:</span><span style="color: #555;">element-type</span> 'character <span style="color: #66cc66;">:</span><span style="color: #555;">initial-element</span> #\a<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>str2 <span style="color: #66cc66;">&#40;</span>make-<span style="color: #b1b100;">array</span> <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">:</span><span style="color: #555;">element-type</span> 'character <span style="color: #66cc66;">:</span><span style="color: #555;">initial-element</span> #\a<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>values <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">=</span> str1 str2<span style="color: #66cc66;">&#41;</span>
	  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eq</span> str1 str2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;; =&gt; T NIL</span></pre></div></div>



<h3>パッケージによるオブジェクト同一性の保証</h3>
<p>シンボルは単なるオブジェクトなので、「『同じ名前』に対しては常に同じオブジェクトが割り当てられる」という、まさにシンボルがシンボルたる性質は、実はパッケージ・システムによって実現されている。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>sym1 'foo<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>sym2 'foo<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>values <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span>symbol-<span style="color: #b1b100;">name</span> sym1<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>symbol-<span style="color: #b1b100;">name</span> sym2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eq</span> sym1 sym2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;; =&gt; T T</span></pre></div></div>



<h3>マクロにおけるオブジェクト同一性の保証</h3>
<p>gensym を使ったマクロを書く場合などは、パッケージ・システムに頼らず自分でシンボル・オブジェクトの同一性を保証していることになる。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defmacro</span> sym-test <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>sym <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">gensym</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    `<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eq</span> '<span style="color: #66cc66;">,</span>sym '<span style="color: #66cc66;">,</span>sym<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;; =&gt; T</span></pre></div></div>



<p>上のコードにおいて sym はシンボル・オブジェクトに展開される（シンボルの「名前」ではない）ので、インターンされないシンボルを使っても、オブジェクトの同一性が保たれる。</p>
<p>つまり展開後のコードは、下のコードと等価では無い。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eq</span> '#<span style="color: #66cc66;">:</span><span style="color: #555;">G762</span> '#<span style="color: #66cc66;">:</span><span style="color: #555;">G762</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;; =&gt; NIL</span></pre></div></div>



<p>展開後のコードに含まれているのは、あくまでもシンボル・オブジェクトである。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">mapcar</span> #'<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>c<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>class-of <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cadr</span> c<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>rest <span style="color: #66cc66;">&#40;</span>macroexpand-<span style="color: #cc66cc;">1</span> '<span style="color: #66cc66;">&#40;</span>sym-test<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;; =&gt; (#&lt;BUILT-IN-CLASS SYMBOL&gt; #&lt;BUILT-IN-CLASS SYMBOL&gt;)</span></pre></div></div>




]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/671/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>『実践Common Lisp』20.6 EVAL-WHEN</title>
		<link>http://wp.serpere.info/archives/623</link>
		<comments>http://wp.serpere.info/archives/623#comments</comments>
		<pubDate>Wed, 29 Jul 2009 12:46:46 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Common Lisp]]></category>
		<category><![CDATA[『実践Common Lisp』]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=623</guid>
		<description><![CDATA[「20.6 EVAL-WHEN」に書いてある内容がどう考えてもおかしくて、これは翻訳のミスじゃないかと思って調べてみたら、やはり正誤表に載っていた。とはいえ多分、そもそも原文も分かりにくいのだろうと思う。HyperSpecの説明の方がずっと分かりやすい。 :compile-toplevel と :load-toplevel が意味を持つのは、次の2つの条件が揃ったときだけだ。 COMPILE-FILE でlispファイルをコンパイルするとき EVAL-WHEN がトップレベルフォームとして現れる場合 :comile-toplevel が指定されていれば、コンパイル時に評価される。:load-toplevel が指定されていれば、faslファイルを LOAD したときに評価される。 上の2条件が揃わない場合は、「:execute が指定されていれば評価される」「:execute が指定されていないと評価されない」という、ごく単純な動作になる。 HyperSpecに載っている例よりも、さらに直接的な例を考えてみた。 &#40;eval-when &#40;:execute&#41; &#40;defun foo &#40;&#41; &#34;foo-execute&#34;&#41;&#41; &#160; &#40;eval-when &#40;:compile-toplevel&#41; &#40;defun foo &#40;&#41; &#34;foo-compile-toplevel&#34;&#41;&#41; &#160; &#40;eval-when &#40;:load-toplevel&#41; &#40;defun foo &#40;&#41; &#34;foo-load-toplevel&#34;&#41;&#41; &#160; &#40;defmacro foo-macro&#40;&#41; &#40;foo&#41;&#41; &#160; &#40;defun main&#40;&#41; &#40;format t &#34;~a~%&#34; &#40;foo&#41;&#41; &#40;format t &#34;~a~%&#34; &#40;foo-macro&#41;&#41;&#41; LOAD [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F623%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%E3%80%8E%E5%AE%9F%E8%B7%B5Common%20Lisp%E3%80%8F20.6%20EVAL-WHEN%22%20%7D);"></div>
<p>「20.6 EVAL-WHEN」に書いてある内容がどう考えてもおかしくて、これは翻訳のミスじゃないかと思って調べてみたら、やはり<a href="http://pcl.lispuser.net/wiliki.cgi?%E6%AD%A3%E8%AA%A4%E8%A1%A8#H-1cbu8y4">正誤表</a>に載っていた。とはいえ多分、そもそも原文も分かりにくいのだろうと思う。<a href="http://www.lispworks.com/documentation/HyperSpec/Body/s_eval_w.htm">HyperSpecの説明</a>の方がずっと分かりやすい。</p>
<p>:compile-toplevel と :load-toplevel が意味を持つのは、次の2つの条件が揃ったときだけだ。</p>
<ol>
<li>COMPILE-FILE でlispファイルをコンパイルするとき</li>
<li>EVAL-WHEN がトップレベルフォームとして現れる場合</li>
</ol>
<p>:comile-toplevel が指定されていれば、コンパイル時に評価される。:load-toplevel が指定されていれば、faslファイルを LOAD したときに評価される。</p>
<p>上の2条件が揃わない場合は、「:execute が指定されていれば評価される」「:execute が指定されていないと評価されない」という、ごく単純な動作になる。</p>
<p>HyperSpecに載っている例よりも、さらに直接的な例を考えてみた。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>eval-<span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">execute</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> foo <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #ff0000;">&quot;foo-execute&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>eval-<span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">compile-toplevel</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> foo <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #ff0000;">&quot;foo-compile-toplevel&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>eval-<span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">load-toplevel</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> foo <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #ff0000;">&quot;foo-load-toplevel&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defmacro</span> foo-macro<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>foo<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>format t <span style="color: #ff0000;">&quot;~a~%&quot;</span> <span style="color: #66cc66;">&#40;</span>foo<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>format t <span style="color: #ff0000;">&quot;~a~%&quot;</span> <span style="color: #66cc66;">&#40;</span>foo-macro<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>



<p>LOAD でlispファイルを読み込めば、</p>
<pre>
foo-execute
foo-execute
</pre>
<p>と表示される。COMPILE-FILEでコンパイルしたfaslファイルを読み込めば、</p>
<pre>
foo-load-toplevel
foo-compile-toplevel
</pre>
<p>と表示される。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/623/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Common LispでFizz-Buzz問題・コンディションで</title>
		<link>http://wp.serpere.info/archives/621</link>
		<comments>http://wp.serpere.info/archives/621#comments</comments>
		<pubDate>Sun, 26 Jul 2009 12:14:13 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Common Lisp]]></category>
		<category><![CDATA[『実践Common Lisp』]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=621</guid>
		<description><![CDATA[コンディションの練習のために、Fizz-Buzz問題をコンディションを使って解いてみた。「15で割り切れる」「3で割り切れる」「5で割り切れる」といった事態をそれぞれエラーと見なし、別の値を使うという選択肢（use-value）を用意した上で、loop時にFizz,Buzz,FizzBuzzという文字列を割り当てている。 &#40;define-condition multiple-of-15 &#40;error&#41; &#40;&#41;&#41; &#40;define-condition multiple-of-3 &#40;error&#41; &#40;&#41;&#41; &#40;define-condition multiple-of-5 &#40;error&#41; &#40;&#41;&#41; &#160; &#40;defun fizz-buzz-cond &#40;n&#41; &#40;restart-case &#40;cond &#40;&#40;zerop &#40;mod n 15&#41;&#41; &#40;error 'multiple-of-15&#41;&#41; &#40;&#40;zerop &#40;mod n 3&#41;&#41; &#40;error 'multiple-of-3&#41;&#41; &#40;&#40;zerop &#40;mod n 5&#41;&#41; &#40;error 'multiple-of-5&#41;&#41; &#40;t n&#41;&#41; &#40;use-value &#40;value&#41; value&#41;&#41;&#41; &#160; &#40;defun use-value-fn &#40;value&#41; #'&#40;lambda &#40;c&#41; &#40;declare &#40;ignore c&#41;&#41; &#40;invoke-restart 'use-value value&#41;&#41;&#41; &#160; [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F621%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Common%20Lisp%E3%81%A7Fizz-Buzz%E5%95%8F%E9%A1%8C%E3%83%BB%E3%82%B3%E3%83%B3%E3%83%87%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%22%20%7D);"></div>
<p>コンディションの練習のために、Fizz-Buzz問題をコンディションを使って解いてみた。「15で割り切れる」「3で割り切れる」「5で割り切れる」といった事態をそれぞれエラーと見なし、別の値を使うという選択肢（use-value）を用意した上で、loop時にFizz,Buzz,FizzBuzzという文字列を割り当てている。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define-condition multiple-of-<span style="color: #cc66cc;">15</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">error</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-condition multiple-of-<span style="color: #cc66cc;">3</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">error</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-condition multiple-of-<span style="color: #cc66cc;">5</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">error</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> fizz-buzz-<span style="color: #b1b100;">cond</span> <span style="color: #66cc66;">&#40;</span>n<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>restart-<span style="color: #b1b100;">case</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">zerop</span> <span style="color: #66cc66;">&#40;</span>mod n <span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">error</span> 'multiple-of-<span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	    <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">zerop</span> <span style="color: #66cc66;">&#40;</span>mod n <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">error</span> 'multiple-of-<span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	    <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">zerop</span> <span style="color: #66cc66;">&#40;</span>mod n <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">error</span> 'multiple-of-<span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	    <span style="color: #66cc66;">&#40;</span>t n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>use-<span style="color: #b1b100;">value</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">value</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">value</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> use-value-fn <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">value</span><span style="color: #66cc66;">&#41;</span>
  #'<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>c<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>declare <span style="color: #66cc66;">&#40;</span>ignore c<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>invoke-restart 'use-<span style="color: #b1b100;">value</span> <span style="color: #b1b100;">value</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> run-fizz-buzz <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>handler-bind <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>multiple-of-<span style="color: #cc66cc;">15</span> <span style="color: #66cc66;">&#40;</span>use-value-fn <span style="color: #ff0000;">&quot;FizzBuzz&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
		 <span style="color: #66cc66;">&#40;</span>multiple-of-<span style="color: #cc66cc;">3</span>  <span style="color: #66cc66;">&#40;</span>use-value-fn <span style="color: #ff0000;">&quot;Fizz&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
		 <span style="color: #66cc66;">&#40;</span>multiple-of-<span style="color: #cc66cc;">5</span>  <span style="color: #66cc66;">&#40;</span>use-value-fn <span style="color: #ff0000;">&quot;Buzz&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>loop for n from <span style="color: #cc66cc;">1</span> to <span style="color: #cc66cc;">100</span> <span style="color: #b1b100;">do</span> <span style="color: #66cc66;">&#40;</span>format t <span style="color: #ff0000;">&quot;~a~%&quot;</span> <span style="color: #66cc66;">&#40;</span>fizz-buzz-<span style="color: #b1b100;">cond</span> n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>




]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/621/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Common LispでFizz-Buzz問題・総称関数を使って</title>
		<link>http://wp.serpere.info/archives/617</link>
		<comments>http://wp.serpere.info/archives/617#comments</comments>
		<pubDate>Sat, 25 Jul 2009 12:52:57 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Common Lisp]]></category>
		<category><![CDATA[『実践Common Lisp』]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=617</guid>
		<description><![CDATA[総称関数の練習のために、Fizz-Buzz問題を総称関数を使って解いてみた。独自のメソッド結合まで使った、無駄に大掛かりな物になっている。 &#40;defun strcat &#40;&#38;rest strings&#41; &#40;apply 'concatenate `&#40;string ,@strings&#41;&#41;&#41; &#160; &#40;define-method-combination strcat :identity-with-one-argument t&#41; &#160; &#40;defgeneric fizz-buzz-method &#40;mod3 mod5&#41; &#40;:documentation &#34;mod3が0ならFizz, mod5が0ならBuzz&#34;&#41; &#40;:method-combination strcat&#41;&#41; &#160; &#40;defmethod fizz-buzz-method strcat &#40;&#40;mod3 &#40;eql 0&#41;&#41; mod5&#41; &#34;Fizz&#34;&#41; &#160; &#40;defmethod fizz-buzz-method strcat &#40;mod3 &#40;mod5 &#40;eql 0&#41;&#41;&#41; &#34;Buzz&#34;&#41; &#160; &#40;defmethod fizz-buzz-method strcat &#40;mod3 mod5&#41; &#34;&#34;&#41; &#160; &#40;defun empty-p &#40;seq&#41; &#40;if &#40;= [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F617%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Common%20Lisp%E3%81%A7Fizz-Buzz%E5%95%8F%E9%A1%8C%E3%83%BB%E7%B7%8F%E7%A7%B0%E9%96%A2%E6%95%B0%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%22%20%7D);"></div>
<p>総称関数の練習のために、Fizz-Buzz問題を総称関数を使って解いてみた。独自のメソッド結合まで使った、無駄に大掛かりな物になっている。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> strcat <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>rest strings<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span> 'concatenate `<span style="color: #66cc66;">&#40;</span>string <span style="color: #66cc66;">,</span>@strings<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-method-combination strcat <span style="color: #66cc66;">:</span><span style="color: #555;">identity-with-one-argument</span> t<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defgeneric fizz-buzz-method <span style="color: #66cc66;">&#40;</span>mod3 mod5<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">documentation</span> <span style="color: #ff0000;">&quot;mod3が0ならFizz, mod5が0ならBuzz&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">method-combination</span> strcat<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defmethod fizz-buzz-method strcat <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>mod3 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eql</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> mod5<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Fizz&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defmethod fizz-buzz-method strcat <span style="color: #66cc66;">&#40;</span>mod3 <span style="color: #66cc66;">&#40;</span>mod5 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eql</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Buzz&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defmethod fizz-buzz-method strcat <span style="color: #66cc66;">&#40;</span>mod3 mod5<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> empty-p <span style="color: #66cc66;">&#40;</span>seq<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">length</span> seq<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">nil</span> seq<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> fizz-buzz <span style="color: #66cc66;">&#40;</span>n<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>format t <span style="color: #ff0000;">&quot;~a~%&quot;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">or</span> <span style="color: #66cc66;">&#40;</span>empty-p <span style="color: #66cc66;">&#40;</span>fizz-buzz-method <span style="color: #66cc66;">&#40;</span>mod n <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>mod n <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>



<p>総称関数の使い勝手はHaskellやErlangのパターンマッチと似たところがあるが、マッチするメソッドが一度に全部手に入り、それらを結合できるところが決定的に違う。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/617/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Common LispでFizz-Buzz問題・さらに短く</title>
		<link>http://wp.serpere.info/archives/601</link>
		<comments>http://wp.serpere.info/archives/601#comments</comments>
		<pubDate>Thu, 23 Jul 2009 14:43:16 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Common Lisp]]></category>
		<category><![CDATA[『実践Common Lisp』]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=601</guid>
		<description><![CDATA[『実践Common Lisp』18章を読んで、さらに別の書き方を思いついた。format関数の条件制御構文を使用する。 &#40;defun fizz-buzz-format &#40;n&#41; &#40;let &#40;&#40;s &#40;format nil &#34;~[Fizz~;~]~[Buzz~;~]&#34; &#40;mod n 3&#41; &#40;mod n 5&#41;&#41;&#41;&#41; &#40;format t &#34;~a~%&#34; &#40;if &#40;string= &#34;&#34; s&#41; n s&#41;&#41;&#41;&#41; 2つのformat関数を１つにまとめるのは…無理かな？ 追記:思いついた &#40;defun fizz-buzz-format2 &#40;n&#41; &#40;format t &#34;~[Fizz~;~]~[Buzz~;~]~@*~[~:;~[~:;~a~]~]~%&#34; &#40;mod n 3&#41; &#40;mod n 5&#41; n&#41;&#41; わずか一行に収まるとは。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F601%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Common%20Lisp%E3%81%A7Fizz-Buzz%E5%95%8F%E9%A1%8C%E3%83%BB%E3%81%95%E3%82%89%E3%81%AB%E7%9F%AD%E3%81%8F%22%20%7D);"></div>
<p>『実践Common Lisp』18章を読んで、さらに別の書き方を思いついた。format関数の条件制御構文を使用する。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> fizz-buzz-format <span style="color: #66cc66;">&#40;</span>n<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>s <span style="color: #66cc66;">&#40;</span>format <span style="color: #b1b100;">nil</span> <span style="color: #ff0000;">&quot;~[Fizz~;~]~[Buzz~;~]&quot;</span> <span style="color: #66cc66;">&#40;</span>mod n <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>mod n <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>format t <span style="color: #ff0000;">&quot;~a~%&quot;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;&quot;</span> s<span style="color: #66cc66;">&#41;</span> n s<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>



<p>2つのformat関数を１つにまとめるのは…無理かな？</p>
<h3>追記:思いついた</h3>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> fizz-buzz-format2 <span style="color: #66cc66;">&#40;</span>n<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>format t <span style="color: #ff0000;">&quot;~[Fizz~;~]~[Buzz~;~]~@*~[~:;~[~:;~a~]~]~%&quot;</span> <span style="color: #66cc66;">&#40;</span>mod n <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>mod n <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span> n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>



<p>わずか一行に収まるとは。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/601/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Common Lisp で Fizz-Buzz問題</title>
		<link>http://wp.serpere.info/archives/594</link>
		<comments>http://wp.serpere.info/archives/594#comments</comments>
		<pubDate>Tue, 21 Jul 2009 03:12:00 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Common Lisp]]></category>
		<category><![CDATA[『実践Common Lisp』]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=594</guid>
		<description><![CDATA[ベタに書けばこんな感じか。 &#40;defun fizz-buzz-normal &#40;num&#41; &#40;format t &#34;~a~%&#34; &#40;cond &#40;&#40;zerop &#40;mod num 15&#41;&#41; &#34;FizzBuzz&#34;&#41; &#40;&#40;zerop &#40;mod num 3&#41;&#41; &#34;Fizz&#34;&#41; &#40;&#40;zerop &#40;mod num 5&#41;&#41; &#34;Buzz&#34;&#41; &#40;t num&#41;&#41;&#41;&#41; with-output-to-string を使うとよりエレガント、かも知れない。 &#40;defun fizz-buzz &#40;num&#41; &#40;let &#40;&#40;r &#40;with-output-to-string &#40;s&#41; &#40;when &#40;zerop &#40;mod num 3&#41;&#41; &#40;format s &#34;Fizz&#34;&#41;&#41; &#40;when &#40;zerop &#40;mod num 5&#41;&#41; &#40;format s &#34;Buzz&#34;&#41;&#41;&#41;&#41;&#41; &#40;format t &#34;~a~%&#34; &#40;if &#40;string= [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F594%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Common%20Lisp%20%E3%81%A7%20Fizz-Buzz%E5%95%8F%E9%A1%8C%22%20%7D);"></div>
<p>ベタに書けばこんな感じか。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> fizz-buzz-normal <span style="color: #66cc66;">&#40;</span>num<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>format t <span style="color: #ff0000;">&quot;~a~%&quot;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span>
                     <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">zerop</span> <span style="color: #66cc66;">&#40;</span>mod num <span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;FizzBuzz&quot;</span><span style="color: #66cc66;">&#41;</span>
                     <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">zerop</span> <span style="color: #66cc66;">&#40;</span>mod num <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;Fizz&quot;</span><span style="color: #66cc66;">&#41;</span>
                     <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">zerop</span> <span style="color: #66cc66;">&#40;</span>mod num <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;Buzz&quot;</span><span style="color: #66cc66;">&#41;</span>
                     <span style="color: #66cc66;">&#40;</span>t num<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>



<p>with-output-to-string を使うとよりエレガント、かも知れない。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> fizz-buzz <span style="color: #66cc66;">&#40;</span>num<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>r <span style="color: #66cc66;">&#40;</span>with-output-to-string <span style="color: #66cc66;">&#40;</span>s<span style="color: #66cc66;">&#41;</span>
	       <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">zerop</span> <span style="color: #66cc66;">&#40;</span>mod num <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>format s <span style="color: #ff0000;">&quot;Fizz&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	       <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">zerop</span> <span style="color: #66cc66;">&#40;</span>mod num <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>format s <span style="color: #ff0000;">&quot;Buzz&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>format t <span style="color: #ff0000;">&quot;~a~%&quot;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;&quot;</span> r<span style="color: #66cc66;">&#41;</span> num r<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>



<p>一般化バージョン。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> gen-fizz-buzz <span style="color: #66cc66;">&#40;</span>rules<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>num<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>r <span style="color: #66cc66;">&#40;</span>with-output-to-string <span style="color: #66cc66;">&#40;</span>s<span style="color: #66cc66;">&#41;</span>
		 <span style="color: #66cc66;">&#40;</span>loop for <span style="color: #66cc66;">&#40;</span>b w<span style="color: #66cc66;">&#41;</span> in rules <span style="color: #b1b100;">do</span>
		      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">zerop</span> <span style="color: #66cc66;">&#40;</span>mod num b<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>format s <span style="color: #ff0000;">&quot;~a&quot;</span> w<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>format t <span style="color: #ff0000;">&quot;~a~%&quot;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;&quot;</span> r<span style="color: #66cc66;">&#41;</span> num r<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>



<p>実行。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>loop for n from <span style="color: #cc66cc;">1</span> to <span style="color: #cc66cc;">100</span> <span style="color: #b1b100;">do</span> <span style="color: #66cc66;">&#40;</span>fizz-buzz n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; 3,5,7の倍数の時、それぞれFizz,Buzz,Kozz</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>fizz-buzz-kozz <span style="color: #66cc66;">&#40;</span>gen-fizz-buzz '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span> <span style="color: #ff0000;">&quot;Fizz&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span> <span style="color: #ff0000;">&quot;Buzz&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">7</span> <span style="color: #ff0000;">&quot;Kozz&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>loop for n from <span style="color: #cc66cc;">1</span> to <span style="color: #cc66cc;">100</span> <span style="color: #b1b100;">do</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">funcall</span> fizz-buzz-kozz n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>




]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/594/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

