<?xml version="1.0" encoding="UTF-8" ?> 
<rss version="0.92">
<channel>
  <title>LISPMEMO Recent Changes</title> 
  <link>http://lispuser.net/memo/</link> 
  <description>LISPMEMO Recent Changes</description> 
<item><title> Re: あなたの言語で、これできますか？ (Qi 編)</title><pubDate>2009-02-07 19:41:00</pubDate><link>http://lispuser.net/memo/lisp/2009-02-07-19-41.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> Re: あなたの言語で、これできますか？ (Qi 編)</h2>
<div id="text-1">

<p> 
</p>

<p>
kazu さんの <a href="http://d.hatena.ne.jp/kazu-yamamoto/20090204/1233732939">http://d.hatena.ne.jp/kazu-yamamoto/20090204/1233732939</a>

より、Haskell のデータ構築子について。
</p>

<pre class="example">
evaluate (C 10 :+ C 8 :/ C 2 :* C 7 :- C 4) → 34

おまけ
あなたの言語で、これできますか？
</pre>


<p>
「あなたの(使っている/好みの)言語で」という事で Lisp (<a href="http://lispuser.net/commonlisp/qi.html">Qi</a>
) で挑戦してみた記録。
</p>

<p>
ポイントの組込みのデータ構築子解析というのは中置記法なしの Lisp では辛いので
そこだけは「作れば、ある」という方式でごかんべんを。
</p>

]]></description></item><item><title> MAPF の実装</title><pubDate>2008-10-20 00:20:00</pubDate><link>http://lispuser.net/memo/lisp/2008-10-20-00-20.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> MAPF の実装</h2>
<div id="text-1">

<p> 
</p>

<p>
<a href="http://cadr.g.hatena.ne.jp/g000001/20081015/1224059357">http://cadr.g.hatena.ne.jp/g000001/20081015/1224059357</a>
 からのネタ
</p>

<p>
関数 MAPF を定義してみた。
</p>

]]></description></item><item><title> LTK と日本語</title><pubDate>2008-08-20 00:18:00</pubDate><link>http://lispuser.net/memo/lisp/2008-08-20-00-18.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> LTK と日本語</h2>
<div id="text-1">

<p> 
</p>

<p>
Windows 上の LTK で日本語を使うための Tips を紹介します。
<a href="http://lispuser.net/commonlisp/clisp.html#sec-13">CLISPごった煮</a>
 を作るときに使った手順ですが、ここにまとめておきます。
</p>

<p>
必要なもの:
</p>

<ol>
<li>
日本語 EXTERNAL-FORMAT をサポートしたLISP処理系 (CLISP, SBCL, AllegroCL, LispWorks など)
</li>

<li>
LTK
</li>

<li>
Tcl/Tk (日本語エンコーディングを備えたもの)

</li>

</ol>


<p>以下のようになる事が目標です。
</p>

<pre class="example">
 LISP 処理系 &lt;--- パイプ (UTF-8) ---&gt; Tcl/Tk &lt;--- ファイルの読み書き (UTF-8) ---&gt; ファイル
</pre>


]]></description></item><item><title> Emacs Lisp と Common Lisp</title><pubDate>2008-08-15 00:03:00</pubDate><link>http://lispuser.net/memo/lisp/2008-08-15-00-03.html</link><description><![CDATA[<div class="outline-2" id="outline-container-2">
<h2 id="sec-2"> Emacs Lisp と Common Lisp</h2>
<div id="text-2">

<p> 
</p>

<p>
Emacs Lisp は (Scheme よりは) Common Lisp に近い、ということかと思います。
以下理由:
</p>

<ol>
<li>
真偽: T, NIL で Scheme 族ではない
</li>

<li>
基本が反復。Schemer が使うとほぼ間違いなく再帰が深過ぎというエラーがでる
</li>

<li>
Lisp-2 : 変数と関数の名前空間が別  (let ((car '(item))) (car car)) => item
</li>

<li>
ダイナミックスコープ (CLはレキシカルスコープとダイナミックスコープ、Schemeは基本レキシカルのみ)
</li>

<li>
マクロが伝統的な defmacro
</li>

<li>
破壊的操作を恐れない (むしろ推奨)。命名規則も nrevse とか。
</li>

<li>
伝統的に関数型っぽく書く事を重視しない

</li>

</ol>


<p>Common Lisp の人にとっては「最適化がちょっと弱くて、全部ダイナミックスコープな処理系」だと言われれば
あまり問題はないですが、Schemeしか知らない場合には最初はちょっと辛いでしょう。
</p>

]]></description></item><item><title> ANSI Common Lisp の bfs について</title><pubDate>2008-07-27 01:14:00</pubDate><link>http://lispuser.net/memo/lisp/2008-07-27-01-14.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> ANSI Common Lisp の bfs について</h2>
<div id="text-1">

<p> 
</p>

<p>
先日 ANSI Common Lisp の bfs がわかりにくい、という話があったので。
</p>

<pre class="example">
A -&gt; B, C
B -&gt; C
C -&gt; D
</pre>


<p>
で、このようなネットワークの A から C までの最短経路を求める。
</p>

<pre class="example">
(defun shortest-path (start end net)
  (bfs end (list (list start)) net))

(defun bfs (end queue net)
  (if (null queue)
      nil
      (let ((path (car queue)))
       (let ((node (car path)))
         (if (eql node end)
             (reverse path)
             (bfs end
                  (append (cdr queue)
                          (new-paths path node net))
                  net))))))
                                        
(defun new-paths (path node net)
  (mapcar #&#39;(lambda (n)
             (cons n path))
         (cdr (assoc node net))))
</pre>


<table cellspacing="0" frame="hsides" cellpadding="6" rules="groups" border="2">
<col align="left"></col>
<col align="left"></col>

<tbody>
<tr><td>入力</td>
<td>開始ノード、終了ノード</td>
</tr>

<tr><td>出力</td>
<td>最短の経路が一つ</td>
</tr>

</tbody>

</table>



<p>
最短経路探索は次のようになります。
</p>

]]></description></item><item><title> 実践 Common Lisp 発売!!</title><pubDate>2008-07-26 01:19:00</pubDate><link>http://lispuser.net/memo/lisp/2008-07-26-01-19.html</link><description><![CDATA[<div class="outline-2" id="outline-container-2">
<h2 id="sec-2"> 実践 Common Lisp 発売!!</h2>
<div id="text-2">

<p> 
</p>

<p>
ついに発売です!!
一説によると東京の本屋では平積みだったようで。
</p>

<p>
なんでもLISPコーナーがある本屋があるそうです。
きっとこんな感じになってるに違いない。
</p>

<p>
<img alt="//lispuser.net/files/pcl-book.gif" src="http://lispuser.net/files/pcl-book.gif"></img>

</p>

<p>
注意：写真はイメージです。
</p>
</div>

</div>
]]></description></item><item><title> Common Lisp による日常作業  CSV ファイルを読む (read-line, read-line-into, simple-stream-read-line とか)</title><pubDate>2007-12-14 00:54:00</pubDate><link>http://lispuser.net/memo/lisp/2007-12-14-00-54.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> Common Lisp による日常作業  CSV ファイルを読む (read-line, read-line-into, simple-stream-read-line とか)</h2>
<div id="text-1">

<p> 
</p>

<p>
<a href="http://lispuser.net/memo/lisp/2007-06-29-01-12.html">以前のエントリ</a>
 <a href="http://lispuser.net/files/csv.tar.gz">CSV ファイルを読むコード</a>
 で、ちょろっと
</p>



<blockquote>

<p>
いかにも Scheme なコードなのでループと状態マシンに書き直すとかの高速化の余地がありますね。
</p>



</blockquote>


<p>
今迄ちっこいファイルしか読んでなかったので、ちょっとメモリ使用量が多いなー。
まぁ、Gauche と違って immutable な文字列じゃないんで共有とかできないから効率わるいんじゃろ。
などと目を背けていたのですが、ある程度の規模の CSV を読んだら途端に性能問題が。うがぁ。
</p>

]]></description></item><item><title> メールの検索：cmew, smew  cmew.rb, smew.rb の C による実装 for Mew</title><pubDate>2007-12-11 23:36:00</pubDate><link>http://lispuser.net/memo/lisp/2007-12-11-23-36.html</link><description><![CDATA[<div class="outline-2" id="outline-container-2">
<h2 id="sec-2"> メールの検索：cmew, smew  cmew.rb, smew.rb の C による実装 for Mew</h2>
<div id="text-2">

<p> 
</p>

<p>
私はもう長いこと MUA として Mew を使っているのですが、最近 CVS カレントに
cmew.rb, smew.rb なるファイルが増えていました。のぞいてみると SQLite の DB に
メールのパスと Message-Id を覚えておいて、指定したメールのスレッドを表示するようです。
</p>

<p>
手元に環境がなかったので C でごまかしてみました。ライセンスは MIT ライセンスで。
いろいろ機能がなかったりメールの解析が手抜きだったりしますが、物好きな方はどーぞ。
パッチ等は大歓迎です。:-)
</p>

<pre class="example">
# メールのインデックスを作成します
% cmew ~/Mail/id.db ~/Mail
</pre>


<pre class="example">
# 指定したメッセージ ID のファイルを表示します
% smew ~/Mail/id.db メッセージID メールディレクトリ
/home/onjo/Mail/lisp/10.mew
/home/onjo/Mail/lisp/11.mew
/home/onjo/Mail/lisp/15.mew
/home/onjo/Mail/lisp/16.mew
</pre>


<p>
Mew から使うにはどこかパスの通ったところにインストールして、cmew を実行し、mew-prog-smew 変数を smew.rb から smew に変更しましょう。
運がよければ動くでしょう。
</p>

<p>
ToDo は以下の通り：
</p>

<ul>
<li>
メールの解析がいい加減
</li>

<li>
メールディレクトリの扱いがいい加減
</li>

<li>
リストやハッシュがいい加減 (cons とか make-hash-table がないと駄目な人になってしまっていた…)

</li>

</ul>


<p><a href="http://www.lispuser.net/files/cmew.tar.gz">このへん</a>
 からどーぞ。
</p>
</div>

</div>
]]></description></item><item><title> 末尾再帰とループ問題</title><pubDate>2007-09-16 23:43:00</pubDate><link>http://lispuser.net/memo/lisp/2007-09-16-23-43.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> 末尾再帰とループ問題</h2>
<div id="text-1">

<p> 
</p>

<p>
CL の人が「なんでも再帰」しない理由は、再帰うんぬん以前にループの構文があるからでしょう。
「"Hello" を10 回出力してね繰り返してね」といわれたら〜はいはい繰り返しね、って感じで。
</p>

<pre class="example">
;; すっきり CL
(loop rpeeat 10 do (print &quot;hello&quot;))
(dotimes (i 10) (print &quot;hello&quot;))
</pre>


<pre class="example">
;; 偏見に満ちた Scheme
(llet loop ((n 0)) (when (&lt; n 10) (print &quot;hello&quot;) (loop (+ n 1))))
(foreach (lambda () (print &quot;hello&quot;)) (iota 10))
</pre>


<p>
だいたいのコンパイラだと最適化オプションで ON/OFF できますしね。
毎回完璧に最適化されちゃうとデバッグがなぁ〜
</p>

<p>
とうわけで、 <a href="http://www.cliki.net/Tail%20Recursion">http://www.cliki.net/Tail%20Recursion</a>
 の翻訳（CL の人が末尾再帰について一般的に思う事）。
</p>

]]></description></item><item><title> Common Lisp はコマンド作れない？いや作れます！</title><pubDate>2007-09-05 22:23:00</pubDate><link>http://lispuser.net/memo/lisp/2007-09-05-22-23.html</link><description><![CDATA[<div class="outline-2" id="outline-container-2">
<h2 id="sec-2"> Common Lisp はコマンド作れない？いや作れます！</h2>
<div id="text-2">

<p> 
</p>

<p>
会社の同僚から Matz 日記 (<a href="http://www.rubyist.net/~matz/20070827.html">http://www.rubyist.net/~matz/20070827.html</a>
) のエントリを紹介された。
</p>



<blockquote>

<p>
(Common) Lispの最大の問題は「コマンドが作れないこと」という分析。ライブラリは簡単に作れるんだけど。
</p>

<p>
ここでコマンドとはコマンドラインから実行できるもの、あるいはexecシステムコールで呼び出せるもの(Windowsならstartか)。
</p>

<p>
いや、もちろん作れるんだけど、イメージをまるごと含む形になるため、ほんの小さなプログラムでも巨大になりがち。
これでは「伝統的な開発モデル」にはうまくはまらない、ということ。
</p>

<p>
Smalltalkでも似たような状態なんだけど、とはいえ、これはLisp(や Smalltalk)の最大の利点でもあるわけだし。利点と欠点が表裏一体ということか。
</p>



</blockquote>


<p>
まず、CLISP ならフットプリント 4MB 程度で #!/usr/bin/clisp なスクリプトがかけます。
スクリプトによるコマンドでいいなら別に特別巨大というわけでもないと思います。（手元の Ruby のバイナリが 3MB でした）
</p>

<p>
スタンドアロンバイナリ化にしても、 CLISP ならイメーズファイル + スクリプトのバイトコードサイズになりますので、Ruby や Python の py2exe, Perl の PAR
などのツールと比較しても特別巨大というわけではないと思います。
</p>

<p>
まぁ、SBCL とかの話なんでしょうけど、この手の話題で一番巨大なバイナリを生成する処理系を対象にするのはどうかと。
C の場合は libc (ランタイム) と gcc (コンパイラ) が分離してるけど Lisp だと一体化してるのが普通ですからね。
</p>

<p>
コンパイラに gcc を使う <a href="http://lispuser.net/commonlisp/ecl.html">ECL</a>
 なら小さなスタンドアロンバイナリも出せます (libecl.so は 3MB 程度あるけど)。
</p>

<p>
ネイティブコードコンパイラを備えた処理系でも、たとえば LispWorks なんかはコンパイラの機能を外したりして
スタンドアロンバイナリのサイズを抑える（でも 8MB とかあるけど）機能があったりしますし。
</p>

<p>
スクリプト的な用途だと Emacs Lisp や Gauche もオススメです。
</p>
</div>

</div>
]]></description></item><item><title> Vista で初トラブル  Microsoft の WGA サーバーのトラブル</title><pubDate>2007-08-25 23:51:00</pubDate><link>http://lispuser.net/memo/lisp/2007-08-25-23-51.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> Vista で初トラブル  Microsoft の WGA サーバーのトラブル</h2>
<div id="text-1">

<p> 
</p>

<p>
Lisp と関係ない事は書くまいと思っていたのだが、ついつい……。
</p>

<p>
これまで絶好調だった Windows Vista だが、今日いきなり「非正規品の可能性があります」とかいわれた。
最初は暗号化ファイルシステムサポートのために、わざわざ Ultimate にアップデートしたのに…あの量販店め、偽物つかませやがったか？
何度やっても WGA 認証はエラー。 3 回しか使えない貴重なインシデント使ってしまったり、あちこちサポートフォーラムを見てまわったり。
</p>

<p>
そうしていたら、それっぽい問題を発見。
Validation issues - Microsoft is having WGA server problems. (~<a href="http://forums.microsoft.com/Genuine/ShowPost.aspx?PostID=2053834&amp;ID=25~">http://forums.microsoft.com/Genuine/ShowPost.aspx?PostID=2053834&ID=25~</a>
)
WGA サーバーのトラブルらしい。どうもこの状態で再起動すると Aero 等、機能が制限されてしまうようだ。
BitLocker や暗号化ファイルシステム機能とかも制限されたら洒落にならないので、再起動できない。
ためす勇気もありません。うむむ、あと三日かぁ。
</p>

<p>
フォーラムでもみんな怒ってますね。Vista はかなり安定しているだけに、こんなところに落し穴があったとは。
同様の症状の方は再起動に気をつけましょう……。はやく復旧してくれぇぇぇ。
</p>

<p>
追記： 翌日には無事認証が通りました。よかった。
</p>


</div>


</div>
]]></description></item><item><title> 祝: AllegroCL 8.1 リリース</title><pubDate>2007-08-14 22:26:00</pubDate><link>http://lispuser.net/memo/lisp/2007-08-14-22-26.html</link><description><![CDATA[<div class="outline-2" id="outline-container-2">
<h2 id="sec-2"> 祝: AllegroCL 8.1 リリース</h2>
<div id="text-2">

<p> 
</p>

<p>
忙しくて遅くなってしまいましたが、 Franz から Allegro Common Lisp 8.1 がリリースされています。
というか、先月末だったんですが忙しくて紹介できずに伸び伸びになってました。
</p>

<p>
8.1 からは Allegro Cache, Allegro Btree に加えて Allegro Graph が Professional Edition、Express Edition でも
制限つきで利用可能になりました。
</p>

<p>
忙しくて気がついたらコレを逃がしてしまっていたという。
</p>

<p>
<a href="http://sdf-jp.org/bbs/viewtopic.php?t=5">http://sdf-jp.org/bbs/viewtopic.php?t=5</a>

</p>



<blockquote>

<p>
来る6月16日は、SDFの20周年の誕生日です。 
</p>

<p>
イベントが下記の通り行われます 
</p>

<p>
20周年記念チャット・パーティー CDT 6pm~ (日本時間9amより) 
チャット参加者には抽選でビル・ガスパー氏のパズルが当たります。 
</p>

<p>
SDF20周年についての詳細はこちらをご覧下さい（英語） 
<a href="http://sdf.lonestar.org/news/">http://sdf.lonestar.org/news/</a>

</p>



</blockquote>



<p>
SDF ということは、これ、あのレビーのハッカーズに出てきた Gosper 氏本人ですよねぇ。
するときっとパズルというのは <a href="http://www.gosper.org/">http://www.gosper.org/</a>
 のトップのすごくカッコイイこれですよね。
「Bill Gosper's 12 Piece Twubblesome Twelve」うあぁぁぁぁぁ欲しかったぁぁぁ。
</p>

<ul>
<li>
12 ピースのレーザーカットされた円盤のパズル
</li>

<li>
すべてのディスクを大きな円の中につめ込むのが目的 （簡単だって？ハッ!!）
</li>

<li>
説明書と微細繊維の布つき

</li>

</ul>


<p>なんという一品。…ん、gosper.org から買えるな？ $140 + 送料か。
普段は日記的なことは書かないようにしようと心がけているのですが、一応 Lisp がらみなので。
</p>

]]></description></item><item><title> CFFI で簡単 FFI - libcharguess, NKF32.DLL</title><pubDate>2007-08-08 23:53:00</pubDate><link>http://lispuser.net/memo/lisp/2007-08-08-23-53.html</link><description><![CDATA[<div class="outline-2" id="outline-container-3">
<h2 id="sec-3"> CFFI で簡単 FFI - libcharguess, NKF32.DLL</h2>
<div id="text-3">

<p> 
</p>

<p>
<a href="http://d.hatena.ne.jp/rubikitch/20070808#1186514443">id:rubikitch</a>
 さんのところに C のライブラリを FFI 経由で呼びたい、というネタがありましたので解答しておきます。
</p>

<p>
[追記] 別ページ: <a href="http://lispuser.net/commonlisp/japanese.html">http://lispuser.net/commonlisp/japanese.html</a>
 へ移動。
</p>

<pre class="example">
static VALUE cg_s_guess(VALUE klass, VALUE str) {
  const char*ptr;
  int ret;
  Check_Type(str, T_STRING);
  ret = CharGuessInit();
  ptr = GuessChardet((const char *)RSTRING(str)-&gt;ptr);
  ret = CharGuessDone();
  return ptr ? rb_str_new2(ptr) : Qnil;
}
</pre>


<p>
上記のようなモジュールを、素直に CFFI で表現すると次のようになります。
</p>

]]></description></item><item><title> Common Lisp と日本語と文字コード</title><pubDate>2007-08-07 22:49:00</pubDate><link>http://lispuser.net/memo/lisp/2007-08-07-22-49.html</link><description><![CDATA[<div class="outline-2" id="outline-container-4">
<h2 id="sec-4"> Common Lisp と日本語と文字コード</h2>
<div id="text-4">

<p> 
</p>

<p>
Common Lisp における文字列は「Character」の列だ。C 言語などでは、文字列は実際にはバイト列と等価なので、
この辺は考え方を換える必要がある。もちろん、内部的には何かのエンコーディングによるバイト列を保持
しているわかけだが、I/O や、バイト列との変換には external-format を指定して内部エンコーディングから
目的のエンコーディングへと変換する必要がある。
</p>

<p>
<b>[追記]</b>
 別ページ: <a href="http://lispuser.net/commonlisp/japanese.html">http://lispuser.net/commonlisp/japanese.html</a>
 へ移動。
</p>

<pre class="example">
文字列 (Character の列) &lt;---- external-format ----&gt; バイト列 (unsigned-byte の列)
</pre>


<p>
この external-format は、バイト列への変換以外にも文字列のやりとりなど I/O ストリームでも使用する。
サポートされている external-format の種類や、その API については、処理系毎に異なるので各処理系のマニュアルを参照すること。
</p>

<pre class="example">
[AllegroCL]
バイト列 =&gt; 文字列: ext:octets-to-string
文字列 =&gt; バイト列: ext:string-to-octets

[LispWorks]
バイト列 =&gt; 文字列: ext:decode-external-string
文字列 =&gt; バイト列: ext:encode-lisp-string

[CLISP]
バイト列 =&gt; 文字列: ext:convert-string-from-bytes
文字列 =&gt; バイト列: ext:convert-string-to-bytes

[SBCL]
バイト列 =&gt; 文字列: sb-ext:octets-to-string
文字列 =&gt; バイト列: sb-ext:string-to-octets
</pre>


<p>
しかし、日本語を扱う上では文字列とバイト列の変換 API だけでは不十分な場合がある。
バイト列が手元にあったとして、これも文字列に変換したいケースを考えよう。
あなたの悩みはこうだ。「はて、このバイト列が文字列なのはわかっているが…エンコーディングは何だったっけ？」
</p>

<p>
文字列と external-format の例を示しつつ、バイト列のエンコーディングを推測する処理を作ってみる。
</p>

]]></description></item><item><title> ローカル変数の一覧を取得 @ どう書く？.org</title><pubDate>2007-08-01 23:44:00</pubDate><link>http://lispuser.net/memo/lisp/2007-08-01-23-44.html</link><description><![CDATA[<div class="outline-2" id="outline-container-5">
<h2 id="sec-5"> ローカル変数の一覧を取得 @ どう書く？.org</h2>
<div id="text-5">

<p> 
</p>

<p>
どう書く？のお題というと、こないだのメールのエンコードもなかなか厳しかったです。ライブラリが充実してないので。
で、 w-o-f TAB で with-open-file に補完、みたいな様子を見てもらうと <a href="http://lispuser.net/files/doukaku_mail.swf">解く過程の Flash ムービー</a>
 を撮ったのですが、
1分15枚の設定でやったら大失敗…。マウスの動きだけ妙に補完されて遅いし、タイプは荒い…。がっかり。
</p>

<p>
で、またまた Common Lisp には厳しいお題がでていました。
</p>



<blockquote>

<p>
リフレクション系のお題の続編です。ローカル変数の内容を取得して連想配列(ハッシュ、辞書など)に詰めるコードを書いてください。 
Pythonで表現すると、下のコードの???部分を埋めることになります。 
</p>

<pre class="example">
&gt;&gt;&gt; def foo():
    x = 1
    y = &quot;hello&quot;
    ???
    return result
 
 &gt;&gt;&gt; foo()
 {&#39;y&#39;: &#39;hello&#39;, &#39;x&#39;: 1}
</pre>


<p>
(どうかく.org より転載)
</p>



</blockquote>


<p>
これに挑戦してみます。
</p>

<p>
しかし、コンパイラからするといわゆるローカル変数は定数である事がわかったり、未使用だったりすると最適化の対象にしやすいため
少なくとも変数名と値の対応を全て覚えているというのは期待できませんが…。
</p>

]]></description></item><item><title> どう書くとか油売り算とか</title><pubDate>2007-07-02 00:19:00</pubDate><link>http://lispuser.net/memo/lisp/2007-07-02-00-19.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> どう書くとか油売り算とか</h2>
<div id="text-1">

<p> 
</p>

<p>
<a href="http://ja.doukaku.org/4/">どう書く？</a>
 というサイトで見かけた「n人中m人が当選するくじ (<a href="http://ja.doukaku.org/4/">http://ja.doukaku.org/4/</a>
)」という問題が出題されていました。
</p>

<pre class="example">
;; 最初に投稿しようと思った例
(defun lot-A (lst m)
  (assert (&gt;= (length lst) m) () &quot;...&quot;)
  (flet ((random-select () (let ((e (nth (random (length lst)) lst))) (setf lst (remove e lst)) e)))
    (loop repeat m collect (random-select))))

;; 実際に書くであろう例
(defun lot-B (lst m)
  (assert (&gt;= (length lst) m) () &quot;...&quot;)
  (srfi-1:take (alexander:shuffle lst) m))
</pre>


<p>
結局 Lisp で書くと ``(loop repeat m collect (random-select))`` あるいは ``(take (shuffle lst) m)`` と書くだろうなーと。
標準機能だけで一関数にはしないだろうなぁ、とか悩んでしまった。フォルダ内のバックアップ削除のお題にしても
CL-FAD ライブラを使って ``(fad:walk-directory dir #'byebye-backup)`` と書くだろうしなぁ。むむむ。
</p>

<p>
また、掲示板では次のような書き込みを見かけたので勝手に添削。
</p>


<pre class="example">
 From: [163] デフォルトの名無しさん &lt;&gt;
 Date: 2007/07/01(日) 21:04:30
 
 http://karetta.jp/article/blog/ll-spirit/033840
 これをCLで素朴にやってみたんですけど誰か添削してくれませんか。
</pre>


<p>
油売り算というものらしい。
</p>

<pre class="example">
斗桶 (a) に油が 1 斗 (10 升) ある。これを等分したい。7 升枡 (b) と 3 升枡 (c) しかない。この 2 つの枡
だけで、5 升ずつ等分する方法を記述せよ。

この問題を解くにあたり、(a) に入っている油の容量を第 1 引数、(b) の容量を第 2 引数、(c) の容量を第 3
引数とするプログラムとせよ。

(http://karetta.jp/article/blog/ll-spirit/033840 より)
</pre>



]]></description></item><item><title> PNM (PBM, PNM, PPM) 形式の画像とか CSV ファイルとか</title><pubDate>2007-06-29 01:12:00</pubDate><link>http://lispuser.net/memo/lisp/2007-06-29-01-12.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> PNM (PBM, PNM, PPM) 形式の画像とか CSV ファイルとか</h2>
<div id="text-1">

<p> 
</p>

<p>
はてなで Lisper を発見。
</p>

<ul>
<li>
PNM フォーマットを CLOS で作ってみよう (<a href="http://d.hatena.ne.jp/ytakenaka/20070620/p1">http://d.hatena.ne.jp/ytakenaka/20070620/p1</a>
)
</li>

<li>
CSV ファイルの読み書き (<a href="http://d.hatena.ne.jp/ytakenaka/20070627/p1">http://d.hatena.ne.jp/ytakenaka/20070627/p1</a>
)

</li>

</ul>


<p>というわけで、私もチャレンジ。
</p>

<p>
ここで作った <a href="http://lispuser.net/files/csv.tar.gz">Common Lisp 用 text.csv モジュール</a>
 置いておきます (Gauche の text.csv の移植)。
ドキュメント書いたら CLiki にでも載せようかな。
</p>

]]></description></item><item><title> Common Lisp や Prolog で Reduce(l|r)</title><pubDate>2007-05-29 23:08:00</pubDate><link>http://lispuser.net/memo/lisp/2007-05-29-23-08.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> Common Lisp や Prolog で Reduce(l|r)</h2>
<div id="text-1">

<p> 
</p>

<p>
<a href="http://blog.livedoor.jp/dankogai/archives/50840175.html">404 Blog Not Found:Code Snippets - reduce(l|r)を実装汁!</a>
 ネタ。
Common Lisp には標準であったので話にならなかった。10 分を切れてよかった。
</p>

<pre class="example">
(defun reducel (fn lst) (reduce fn lst))
(defun reducer (fn lst) (reduce fn lst :from-end t))
</pre>


<p>
つまらないので Prolog 版。うむ、やっぱり Prolog はいい。call で高階関数も使えるし（funcall が許せない人には不評かもしれないが）。
</p>

<pre class="example">
% reducel/3
reducel(Fn, [Head | Tail], Result) :- reducel(Fn, Head, Tail, Result).
% reducel/4
reducel(_, Result, [], Result).
reducel(Fn, Init, [Head | Tail], Result) :-
    call(Fn, Init, Head, Temp),
    reducel(Fn, Temp, Tail, Result).

% reducer/3
reducer(Fn, List, Result) :-
    reverse(List, [Init | Temp]),
    reverse(Temp, Tail),
    reducer(Fn, Init, Tail, Result).
% reducer/4
reducer(_, Result, [], Result).
reducer(Fn, Init, [Head | Tail], Result) :-
    reducer(Fn, Init, Tail, Temp),
    call(Fn, Head, Temp, Result).
</pre>


<p>
ついでに Allegro Prolog 版。直訳。
</p>

<pre class="example">
;; reducel/3
(&lt;-- (reducel ?fn (?x . ?xs) ?result) (reducel ?fn ?x ?xs ?result))
;; reducel/4
(&lt;-- (reducel ? ?result () ?result))
(&lt;-  (reducel ?fn ?init (?x . ?xs) ?result)
     (is ?temp (funcall ?fn ?init ?x))
     (reducel ?fn ?temp ?xs ?result))

;; reducer/3
(&lt;-- (reducer ?fn ?lst ?result)
     (is (?x ?xs) (list (first (last ?lst))
            (butlast ?lst)))
     (reducer ?fn ?x ?xs ?result))
;; reducer/4
(&lt;-- (reducer ? ?result () ?result))
(&lt;-  (reducer ?fn ?init (?x . ?xs) ?result)
     (reducer ?fn ?init ?xs ?temp)
     (is ?result (funcall ?fn ?x ?temp)))
</pre>


<p>
最後に組み込みの reduce を使わずに CL で書いた例。
Scheme の人が再帰版は書くでしょうからあえて反復で。
</p>

]]></description></item><item><title> S 式ベース DSL の思い出とか Prolog の思い出とか</title><pubDate>2007-05-17 23:48:00</pubDate><link>http://lispuser.net/memo/lisp/2007-05-17-23-48.html</link><description><![CDATA[<div class="outline-2" id="outline-container-2">
<h2 id="sec-2"> S 式ベース DSL の思い出とか Prolog の思い出とか</h2>
<div id="text-2">

<p> 
</p>

<p>
前に FizzBuzz ネタやったときに、なぜか懐しい事を思い出したので。
</p>

<p>
ふと Lisp の応用例（？）といえそうなネタを思い出した。Microsoft の Age of Empire II というゲームを御存知だろうか？
私が学生時代にとても流行したゲームなんですが、これって AI をプログラミングする機能がありましてね。
AI Scripters (<a href="http://www.aiscripters.com/index.php">http://www.aiscripters.com/index.php</a>
) というサイトで解説されてます。
誰もこれを Lisp とは呼びませんでしたが、皆でハックして AI War とかやって遊べたんですね。
</p>

<pre class="example">
(defrule
  (current-age == dark-age)
  (building-type-count mill &lt; 2)
  (sheep-and-forage-too-far)
  (or
    (players-unit-type-count my-player-number 122 &gt; 0)
    (players-unit-type-count my-player-number 216 &gt; 0)
  )
  (can-build mill)
=&gt;
  (chat-local-to-self &quot;Found some hunting, building a mill.&quot;)
  (build mill)
  (disable-self)
)
</pre>


<p>
前置記法じゃないけど S 式ですね。しかも宣言的。LISA の推論ルールみたいな形式。
ルールを定義して、マッチするとアクションが動作する。ゲームの状態 (Fact) をベースに
ルールとアクションを定義する。いやーいいですね。
</p>

<pre class="example">
(defrule 条件 =&gt; アクション)
</pre>


<pre class="example">
;; 例： エリート侍ユニットの人数に応じて不気味な笑い
(defconstant villager-goal 1)
(defrule (unit-type-count elite-samurai == 5) =&gt; (set-goals samurai-goal 5))
(defrule (unit-type-count elite-samurai == 10) =&gt; (set-goals samurai-goal 10))
(defrule (samurai-goal == 5) =&gt; (chat-to-all &quot;fufufu ...&quot;))
(defrule (samurai-goal == 10) =&gt; (chat-to-all &quot;hehehehe ...&quot;))
</pre>


<p>
今から思えば Norvig の教科書にでてくる宣言的スタイルです。
私の中では結構理想的なわかりやすさでしたね。S 式ベースの DSL の好例というか。
破城槌 + ナイトの数が揃ったら敵の城を破壊に!! とかルールを書いてくわけです。
</p>

<p>
S 式だから読み難いんだ、S 式は皆に嫌われている、というのはプログラマだけなんじゃないですかねー。
あんまりこの AI スクリプトの仕様に文句つけたりする人はいなかったように思います。
言語仕様等の詳細は AI Scripters のページをどうぞ。あるいは製品の CD にドキュメントが入っていたと思います。 <sup><a href="#fn.1" name="fnr.1" class="footref">1</a>
</sup>
_
用語は Lisp とかなり異なっていますが、ほぼ困る事はないでしょう。
というかエンジンが Lisp ということはないだろうから、これは「Lisp 以外で S 式を利用した例」なんだろうなー。
S 式はだめだめだという主張を良く聞きますが、いや、そんなことはない!! 実は某超人気ゲームでも採用されていた!!
かつ、ユーザーコミュニティにも受け入れられていた!! なんつって反論できますね。さすがにちょっと古すぎか :-)
</p>



<blockquote>

<p>
製品 CD-ROM の DOCS フォルダ以下の CPSB.DOC (Computer Player Strategy Builder Guide) ですね。今見直してもいいですね〜。やっぱ製品はしっかりしてるなー。
</p>



</blockquote>


<p>
で、本題ですが Prolog は楽しい。なんというか、昔教わっていたときに
</p>

<pre class="example">
factorial(0,1).
factorial(N,X) :-
        factorial(N1, X1),
        N is N1 + 1,
        X is N * X1.
</pre>


<p>
という定義を打ちこんで、動作を試していたら…
</p>

<pre class="example">
?- factorial(3, X).

X = 6 

Yes
?- factorial(6, X).

X = 720 

Yes
?- factorial(X, 6).

X = 3 
</pre>


<p>
当時は最後のでびっくりした。え、なんで？みたいな。 Prolog の挙動は独特なんですが、当時は
あんまりわかってなかったですからね。手元の junk ディレクトリから時代を追っていくといろいろあっておもしろい。
</p>

]]></description></item><item><title> Prolog で FizzBuzz （おまけ： AllegroProlog）</title><pubDate>2007-05-13 22:36:00</pubDate><link>http://lispuser.net/memo/lisp/2007-05-13-22-36.html</link><description><![CDATA[<div class="outline-2" id="outline-container-3">
<h2 id="sec-3"> Prolog で FizzBuzz （おまけ： AllegroProlog）</h2>
<div id="text-3">

<p> 
</p>

<p>
<a href="http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm">http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm</a>

</p>

<p>
FizzBuzz 問題というのが流行していたらしい。プログラマなら一瞬でかけるはずー、と。
Lisp なら二分以内に…。
</p>

<pre class="example">
(defun fizzbuzz ()
   (loop for i from 1 to 100
         do (format t &quot;~A~%&quot;
              (cond ((= (mod i 15) 0) &quot;FizzBuzz&quot;)
                    ((= (mod i 3) 0) &quot;Fizz&quot;)
                    ((= (mod i 5) 0) &quot;Buzz&quot;)
                    (t i)))))
</pre>


<p>
format の t を忘れて結構ギリギリだった…。
</p>

<pre class="example">
choice(N, X) :- N mod 15 =:= 0, X = &#39;FizzBuzz&#39;, !.
choice(N, X) :- N mod 3 =:= 0, X = &#39;Fizz&#39;, !.
choice(N, X) :- N mod 5 =:= 0, X = &#39;Buzz&#39;, !.
choice(N, N).

fizzbuzz(a) :-
            between(1, 100, N),
            choice(N, X),
            write(X), nl,
            fail.
</pre>


<p>
うーん。カットが見えないほうが好きなんだよなぁ。
</p>

<pre class="example">
fizzbuzz() :-
            between(1, 100, N),
            ( N mod 15 =:= 0 -&gt; X = &#39;FizzBuzz&#39;;
              N mod 3 =:= 0  -&gt; X = &#39;Fizz&#39;;
              N mod 5 =:= 0  -&gt; X = &#39;Buzz&#39;;
              X = N ),
            write(X), nl,
            fail.
</pre>


<p>
こうかなー。再帰させたらこうか。
</p>

<pre class="example">
fizzbuzz(N) :-
            N =&lt; 100,
            ( N mod 15 =:= 0 -&gt; X = &#39;FizzBuzz&#39;;
              N mod 3 =:= 0  -&gt; X = &#39;Fizz&#39;;
              N mod 5 =:= 0  -&gt; X = &#39;Buzz&#39;;
              X = N ),
            write(X), nl,
               M is N + 1,
            fizzbuzz(M).
</pre>


<p>
で、なんで Prolog かというと、要するに Allegro Prolog のサンプルを示したかったからです。
</p>

]]></description></item><item><title> Common Lisp Hyper Spec  CLHS 3.1.1 Introduction to Environments の翻訳</title><pubDate>2007-04-19 23:31:00</pubDate><link>http://lispuser.net/memo/lisp/2007-04-19-23-31.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> Common Lisp Hyper Spec  CLHS 3.1.1 Introduction to Environments の翻訳</h2>
<div id="text-1">

<p> 
</p>

<p>
On Lisp 読んでる人からこのツッコミ (<a href="http://lispuser.net/memo/lisp/2007-03-31-23-26.html">http://lispuser.net/memo/lisp/2007-03-31-23-26.html</a>
) の意味がよくわかんないという反響や、
ちょっと非 Lisper の人との議論にでてきたので、ついでに CLHS 3.1.1 Introduction to Environments の翻訳をしてみました。
環境とスコープとエクステントをおさえればいいかなー  （と、おもったんですが環境だけで力つきた）
</p>

]]></description></item><item><title> プログラミング・アート</title><pubDate>2007-04-11 22:16:00</pubDate><link>http://lispuser.net/memo/lisp/2007-04-11-22-16.html</link><description><![CDATA[<div class="outline-2" id="outline-container-2">
<h2 id="sec-2"> プログラミング・アート</h2>
<div id="text-2">

<p> 
</p>

<p>
著名な Lisper である Joe Marshall 氏の Wiki で見かけた記事の翻訳です。 (<a href="http://code.google.com/p/jrm-code-project/wiki/ProgrammingArt">http://code.google.com/p/jrm-code-project/wiki/ProgrammingArt</a>
)
</p>

]]></description></item><item><title> 自力で最適化コンパイル  コンパイラマクロ</title><pubDate>2007-04-01 14:57:00</pubDate><link>http://lispuser.net/memo/lisp/2007-04-01-14-57.html</link><description><![CDATA[<div class="outline-2" id="outline-container-3">
<h2 id="sec-3"> 自力で最適化コンパイル  コンパイラマクロ</h2>
<div id="text-3">

<p> 
</p>

<p>
あろはさんところ (<a href="http://alohakun.blog7.fc2.com/blog-entry-701.html">http://alohakun.blog7.fc2.com/blog-entry-701.html</a>
) の GCC の最適化関連の話らしいネタ
で Shiro さんのコメントに compiler-macro がさらっと出てきいたので。
</p>



<blockquote>

<p>
CommonLisp処理系の多くは、formatの文字列が定数ならコンパイル時に「format文字列をコンパイル」
します。つまりformat文字列を解釈して行われるであろう動作を直接コードとして吐き出します。
前にコメントしたcompiler-macroを使ってるんで、デフォルトの最適化に不満があれば
自分で最適化するコードを書いてオーバライドできます。
</p>

<p>
Allegro CLに書いた正規表現ライブラリでも、正規表現が定数文字列の時はコンパイル時に
「その正規表現に従って実行するプログラム」を生成してコンパイルするようなcompiler-macro
を書きました。
</p>

<p>
まあ、アドホックな職人技の世界ではありますね。
</p>



</blockquote>


<p>
ここで compiler-macro とはなんぞや？と思った人や、ふつうのマクロを思いうかべた人のために
軽く説明しておきます。
</p>

<p>
C の printf と同様に Lisp でも FORMAT は遅いので、パラメータが全部定数ならコンパイル時に
解決してくれてもいいじゃんと思うことはありませんか？
</p>

<p>
そこで ANSI CL のコンパイラマクロです。FORMAT はあんまり高速じゃないので、コンパイル時に引数が
定数のみなら超絶最適化をかましてしみます。
</p>

]]></description></item><item><title> On Lisp でハマるところ  トップレベルでレキシカルスコープな変数を定義する</title><pubDate>2007-03-31 23:26:00</pubDate><link>http://lispuser.net/memo/lisp/2007-03-31-23-26.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> On Lisp でハマるところ  トップレベルでレキシカルスコープな変数を定義する</h2>
<div id="text-1">

<p> 
</p>

<p>
flatline さんとこの On Lisp ネタに反応。
</p>



<blockquote>

<p>
<a href="http://d.hatena.ne.jp/flappphys/20070324#p1">http://d.hatena.ne.jp/flappphys/20070324#p1</a>

</p>

<p>
サークルの先輩から「なんかどのLispも動的スコープだと思っている人が多くない？」と指摘を受ける．
</p>

<p>
ELispは最初から動的スコープ．
</p>

<p>
Schemeは静的スコープで有名である．動的スコープの実現はライブラリによる方針を取っている．SRFIに（割と歴史の古い）fluid-letが提案されたものの取り消され，現在 "parameter" 系が標準になっているらしい．マルチスレッドとの相性が肝のようだ．
</p>


<ul>
<li>
<a href="http://practical-scheme.net/gauche/man/gauche-refj_26.html">http://practical-scheme.net/gauche/man/gauche-refj_26.html</a>
 Gauche ユーザリファレンス: 4.6 変数束縛 
</li>

<li>
<a href="http://srfi.schemers.org/srfi-15/">http://srfi.schemers.org/srfi-15/</a>
 SRFI 15: Syntax for dynamic scoping. 
</li>

<li>
<a href="http://srfi.schemers.org/srfi-39/">http://srfi.schemers.org/srfi-39/</a>
 SRFI 39: Parameter objects 

</li>

</ul>


<p>Common Lispも基本は静的スコープだが，動的スコープも仕様に組み込まれている．defparameter等のオペレータで定義した変数は動的スコープになる(special variable, dynamic variable)し，ローカル変数はdynamic-extentとしてdeclareすれば動的スコープに変更できる．
</p>

<ul>
<li>
<a href="http://www.lisp.org/HyperSpec/Body/mac_defparametercm_defvar.html">http://www.lisp.org/HyperSpec/Body/mac_defparametercm_defvar.html</a>
 Macro DEFPARAMETER, DEFVAR 
</li>

<li>
<a href="http://www.lisp.org/HyperSpec/Body/dec_dynamic-extent.html">http://www.lisp.org/HyperSpec/Body/dec_dynamic-extent.html</a>
 Declaration DYNAMIC-EXTENT 

</li>

</ul>


<p>しかし「トップレベルで静的スコープの変数を作るにはどうするの？」これが分からない．できないんじゃね？
</p>



</blockquote>


<p>
どこかで見たような話題ですね。みんな引っかかっているような気が。 On Lisp の継続のところでこれでハマった記憶がありますねー。
たしかに defvar は変数を special 宣言しちゃうのでスペシャル変数しかできないです。
ANSI Common Lisp でトップレベルのレキシカルスコープ変数を実現するにはコレ。
</p>

<pre class="example">
;; lexical
(defvar *actual-cont* #&#39;values)
(define-symbol-macro =cont= *actual-cont*)
</pre>


<p>
シンボルマクロは special じゃないので、これで擬似的にトップレベルの静的スコープが実現できます（もちろん変数名のキャプチャには注意しましょう。どうしても嫌なら gensym を使ってもいいかも）。あと、 ``*`` で囲んだ変数名はスペシャル変数につけるものと相場が決まっているので、ここでは cont の変数名を変更しています。
</p>

<p>
元ネタを探したら <a href="http://groups.google.co.jp/group/comp.lang.lisp/browse_thread/thread/77829f1a9f51ed11/">c.l.l のスレッド</a>
 が見つかりました。Google は便利だなぁ…。
</p>

<p>
とかいってるうちに Shiro さんから回答がでてましたね。
でもまぁ、こっちの方法も今流行の SBCL でも警告がでないという利点があるので載せておきます。
</p>



<blockquote>

<p>
defvar は大抵 special 宣言 + setq みたいな実装になっています
</p>

<pre class="example">
   ;; GNU CLISP より抜粋
   (defmacro defvar (&amp;whole whole-form
                   symbol &amp;optional (initial-value nil svar) docstring)
     (unless (symbolp symbol)
       (error-of-type &#39;source-program-error
         :form whole-form
         :detail symbol
         (TEXT &quot;~S: non-symbol ~S cannot be a variable&quot;)
         &#39;defvar symbol))
     (if (constantp symbol)
       (error-of-type &#39;source-program-error
         :form whole-form
         :detail symbol
         (TEXT &quot;~S: the constant ~S must not be redefined to be a variable&quot;)
         &#39;defvar symbol))
     `(LET ()
        (PROCLAIM &#39;(SPECIAL ,symbol)) ;; (proclaim (special ...))
        ,@(if svar
            `((UNLESS (BOUNDP &#39;,symbol)
                (SYS::SET-SYMBOL-VALUE &#39;,symbol ,initial-value))))
        ,@(if docstring
              `((SYS::%SET-DOCUMENTATION &#39;,symbol &#39;VARIABLE &#39;,docstring)))
        &#39;,symbol))
</pre>


<pre class="example">
 ;; SBCL より抜粋
 (defmacro-mundanely defparameter (var val &amp;optional (doc nil docp))
   #!+sb-doc
   &quot;Define a parameter that is not normally changed by the program,
   but that may be changed without causing an error. Declare the
   variable special and sets its value to VAL, overwriting any
   previous value. The third argument is an optional documentation
   string for the parameter.&quot;
   `(progn
      (eval-when (:compile-toplevel)
        (%compiler-defvar &#39;,var))  ;; (proclaim (special ...))
      (eval-when (:load-toplevel :execute)
        (%defparameter &#39;,var ,val ,doc &#39;,docp (sb!c:source-location)))))
 
 (defun %compiler-defvar (var)
   (sb!xc:proclaim `(special ,var)))
</pre>




</blockquote>


]]></description></item><item><title> はてなダイアリーの Lisper にツッコミ</title><pubDate>2007-03-28 22:48:00</pubDate><link>http://lispuser.net/memo/lisp/2007-03-28-22-48.html</link><description><![CDATA[<div class="outline-2" id="outline-container-2">
<h2 id="sec-2"> はてなダイアリーの Lisper にツッコミ</h2>
<div id="text-2">

<p> 
</p>

<p>
ぐあー出先からだとメールも更新もできないーと思っていたんですが、
テキストで ReStrurecturedText 形式のファイルを置くだけなんで、 FTP が使えれば
ここの更新はできる事に気がつきました。
</p>

<p>
で、はてなダイアリー界隈に Lisper を多数発見？
</p>

]]></description></item><item><title> Wikipedia の Common Lisp ページ向け原稿</title><pubDate>2007-03-19 00:58:00</pubDate><link>http://lispuser.net/memo/lisp/2007-03-19-00-58.html</link><description><![CDATA[<div class="outline-2" id="outline-container-3">
<h2 id="sec-3"> Wikipedia の Common Lisp ページ向け原稿</h2>
<div id="text-3">

<p> 
</p>

<p>
On Lisp が発売されたとの事で、Lisp 界隈では喜びの声が多数あがっていますね。
なんか表紙もカッコよさそうです。うひょう。これで、Lisp に興味持つ人が増えるといいなぁ〜と、妄想しつつ。
</p>

<p>
日本の Lisp 界ですが、 Web でみる限り学校でやるのは Scheme がほとんどたと思うので Scheme 人気のほうが高いのはなんとなくわかるんですが、
日本では、別の入門ルートとして xyzzy で Lisp に触れる -> Lisp そのものに興味をもつ -> Lisp 大好き というのもありそうですよねー（私はこのルートです）。
</p>

<p>
で、ふと、Common Lisp のページ <a href="http://ja.wikipedia.org/wiki/Common_Lisp">http://ja.wikipedia.org/wiki/Common_Lisp</a>
 を参照したところ…
ガガーン。Scheme のページより圧倒的に活気がないッ。こいつぁーまずい。
これでは Lisp に興味 -> Wikipedia -> Scheme へ転向という流れが目に浮ぶようだッ。
</p>

<p>
というわけで、大至急ある程度充実している Wikipeida 英語版を翻訳してみました。
原文は Lisp-2 vs Lisp-1、Scheme との違いなども抑えていて結構まとまっているかんじだし。
</p>

<p>
投稿前に見直しもかねてここに貼っておきます。ツッコミ歓迎です。
</p>

]]></description></item><item><title> 作って学ぶ Lisp (2)  超やさしいLispインタプリタの作り方  マクロ導入</title><pubDate>2007-02-25 22:54:00</pubDate><link>http://lispuser.net/memo/lisp/2007-02-25-22-54.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> 作って学ぶ Lisp (2)  超やさしいLispインタプリタの作り方  マクロ導入</h2>
<div id="text-1">

<p> 
</p>



<center>

<p>
<b>この記事は書きかけです</b>

</p>



</center>


<p>
今回は前回作った LISP インタプリタにマクロを実装します。
構文木 Eval 式だと最適化の余地とかあんまりなくて面白くないんで、
次回は大きくリファクタリングしてバイトコード VM の導入ですかねぇ。
</p>

<p>
各章の先頭の煽り文句は、昔某掲示板に投稿した銀河帝国ネタからの抜粋です。↓こんなの。
もちろん第二ファウンデーションは Scheme 使いの集団の予定でした。第一とは仲が悪いあたりも似てますね。
</p>



<blockquote>

<p>
第一銀河帝国は、何世紀にもわたって少しずつ頽廃と崩壊を続けていた。
だが、その事実を理解している人間は、帝国の生んだ最後の天才科学者、ハリ・セルダンだけだった！
彼は自ら完成させたλ歴史学を用いて帝国の滅亡とその後に続く３万年の暗黒時代を予言したのだ。
この暗黒時代をただの千年に短縮するため、セルダンは二つのファウンデーションを設立した…
</p>

<p>
  
</p>

<p>
ガールはセルダンに尋ねた。
</p>

<p>
「でも、なぜ強制的にマイナーにならなければならなかったのですか？」間を置いて、「私には教えていただけないのですか？」
</p>

<p>
「まだ、だめだ。今のところは次の事を知っているだけで十分だ。実用的な Common Lisp がターミナスに建設されるということ。
そして、もうひとつが銀河系の反対側の端に。つまり、”星界の果て”に建設されるということ。」
</p>

<p>

</p>

<p>
ついにセルダンは計算をやめて、いった。「これは１０年後の LispOS だ。これをどう解釈するかね？」
</p>

<p>
かれは小首を傾げて、待った。
</p>

<p>
ガールは信じられないようにいった。
</p>

<p>
「完全な滅亡です！GUI を装備していたということすら忘れられている！しかし…しかし、そんなことはありえません。
いまだかつて… MAC LISP コンパイラは Fortran コンパイラにさえ負けなかったというのに…」
</p>

<p>
「これこれ、この結果がどうやって出たか見ただろうに。しばらく記号体系は忘れて、言葉で表現してみたまえ」
</p>

<p>
「Lisp マシンそのものが増大する汎用マイクロプロセッサのパワーに押されて性能的に厳しい状態に置かれます。
また、CPU パワーやメモリを有効活用するために C のような言語が普及し、それにつれて、
Lisp の GC 等は性能上の問題とみなされるようになります。
その結果、S 式に対する反感が増大し、メモリ管理は原始的な手動管理に退行し、
バッファオーバーフローが社会的問題になります」
</p>



</blockquote>


]]></description></item><item><title> S式の限界</title><pubDate>2007-01-28 01:54:00</pubDate><link>http://lispuser.net/memo/lisp/2007-01-28-01-54.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> S式の限界</h2>
<div id="text-1">

<p> 
</p>

<p>
息抜きに小ネタをば。Shiro さんとこの <a href="http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Lisp%3aS%e5%bc%8f%e3%81%ae%e7%90%86%e7%94%b1">Lisp:S式の理由</a>
 の中のネタより。
</p>



<blockquote>

<p>
個人的には、condは (Paul GrahamがArcで提案しているように) 括弧をひとつ
省いて、(cond 述語 式 述語 式 ) でいいんじゃないかという気がします。
式に複数の処理を書きたければbeginを使うと。
</p>

<pre class="example">
(cond (predicate x) (begin (do-something) (do-something2))
      (predicate y) (do-another-thing)
      else          (do-whatever))
</pre>


<p>
また、letについては、束縛とボディの式に別種の括弧を使うとか： 
</p>

<pre class="example">
(let [x (calculate-x a b c)]
     [y (calculate-y d e f)]
  body ...)
</pre>




</blockquote>


<p>
なるほど、この辺は Lisper 間での意思統一が難しそうですね。
括弧の量が問題になるのなら、種類ではなく括弧を。
区切りがよくわからないなら記号を導入すべきではないでしょうか。
</p>

<pre class="example">
;; 個人的に好みの cond
(cond (predicate x) =&gt; (do-something1)
                      (do-something2)
     (predicate y) =&gt; (do-another-thing)
     else          =&gt; (do-whatever))
</pre>


<p>
矢印派の勢力を拡大すべく <a href="http://lispuser.net/files/econd.swf">矢印cond</a>
 のムービーを用意しました。
総製作時間 5 分に渡る大長編。
</p>

<p>
あ、しまった <code>=></code>
 だと SRFI の拡張 cond/case と紛らわしいですね…… orz
じゃあ let の拡張は <- を使って…。
</p>

<pre class="example">
;; 個人的に好みの let
(let
   x &lt;- (calculate-x a b c)
   y &lt;- (calculate-y d e f)
 in
   body ...)
</pre>


<p>
寝る前に矢印 let にもチャレンジ。
<a href="http://lispuser.net/files/lets.swf">矢印let</a>
 ムービーも用意しました。見直すと、不要な処理がありますね。
</p>

<p>
つうか in は不要なんじゃないかとか。いや、でもエディタ支援のときに
キーワードが欲しいなー。でもキーワードという概念が Lisp に合わないような。
</p>

<p>
こうして構文を作るのは簡単ですが「正しい事」へと到達するのは難しかったのです。
そして Lisper は満足できずに結局 S 式を使いつづけるのでした。
おしまいおしまい。
</p>

<p>
みんなが好き勝手にいろいろ試すのを「マクロの暗黒面」としてとらえる人も
多いかと思いますが、「正しい事」は多くのハッカーが議論を尽した結果得ら
れるものなんです。…と正当化してみましたがやっぱ苦しいですかね。
</p>

<ul>
<li>
<a href="http://lispuser.net/files/econd.swf">矢印cond</a>
 : 5 分でできる新しい cond (Flash ムービー)
</li>

<li>
<a href="http://lispuser.net/files/lets.swf">矢印let</a>
 : 10 分でできる新しい let (Flash ムービー)

</li>

</ul>


<p>でも使ってみると Emacs の支援が弱くなるので、構文だけつくっても今一なんだよなぁ…。
ねむいのでこのへんで。
</p>

</div>


</div>
]]></description></item><item><title> Lisp が大人気（ある意味で）</title><pubDate>2007-01-25 20:50:00</pubDate><link>http://lispuser.net/memo/lisp/2007-01-25-20-50.html</link><description><![CDATA[<div class="outline-2" id="outline-container-2">
<h2 id="sec-2"> Lisp が大人気（ある意味で）</h2>
<div id="text-2">

<p> 
</p>

<p>
各方面で大絶賛の嵐。というより Lisp を叩くのが人気。
</p>

<ul>
<li>
Lisp の不人気は相当なものである - <a href="http://www.rubyist.net/~matz/20070112.html">http://www.rubyist.net/~matz/20070112.html</a>

</li>

<li>
Lispが大衆受けしない理由は、その表記法の非人間性、あるいは、慣習との齟齬に尽きると感じています。 - <a href="http://enbug.tdiary.net/20070118.html#p02">http://enbug.tdiary.net/20070118.html#p02</a>

</li>

<li>
Lisp が敬遠されてる理由って、はっきりいって syntax だと思うなぁ - <a href="http://d.hatena.ne.jp/babie/20070118/1169119443">http://d.hatena.ne.jp/babie/20070118/1169119443</a>


</li>

</ul>


<p>こうして不人気の再生産に入るのか？
</p>

<p>
<b>追記：1/28</b>
 Shiro さんのところに素晴しいエントリが。
</p>

<ul>
<li>
<a href="http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Lisp%3a%e3%82%88%e3%81%8f%e3%81%82%e3%82%8b%e8%aa%a4%e8%a7%a3">Lisp:よくある誤解</a>

</li>

<li>
<a href="http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Lisp%3a%e3%82%88%e3%81%8f%e3%81%82%e3%82%8b%e6%ad%a3%e8%a7%a3">Lisp:よくある正解</a>

</li>

<li>
<a href="http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Lisp%3aS%e5%bc%8f%e3%81%ae%e7%90%86%e7%94%b1">Lisp:S式の理由</a>




<blockquote>

<p>
S式のメリットをLisperに尋ねれば、エディタがどうの、マクロがどうの、といった
回答が真っ先に返って来ると思うんですが、そういう理屈をいくら理解しても 
S式がダメな人がS式を好きになったりはしません。どうも、もっと根本的な
感覚に大きな隔たりがあるような気がします。非Lisperから理解しがたい、
Lisperの持つ感覚とはどんなものなんでしょうか。Lisp脳から見た世界はどん
なものなのでしょうか。
</p>



</blockquote>


</li>

</ul>


<p>ちょっと前に S 式の利点（エディタがどうの）を説明しようと必死になっていましたがその通りですね。
しかも、このエントリは（マクロがどうの）といった話をしてしまいました :-(
</p>

]]></description></item><item><title> 括弧の理由 (1)  Emacs による S 式編集支援</title><pubDate>2006-12-20 20:36:00</pubDate><link>http://lispuser.net/memo/lisp/2006-12-20-20-36.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> 括弧の理由 (1)  Emacs による S 式編集支援</h2>
<div id="text-1">

<p> 
</p>

<p>
Lisp の括弧は良くネタにされます。実際、大量の過去は最初のインパクトは強烈だったのを覚えています。
いったいなぜ Lisper は括弧を捨てないのでしょう？
歴史的にみれば括弧を好まない Lisper も居ます。古くは CMU の AI リポジトリに CGOL という ALGOL ライクな
構文の Lisp リーダ/ライタがあり、これは S 式と相互に変換できました。CGOL で書いて、S 式で表示とかができたわけですね。
</p>

<pre class="example">
 ;;Execute by typing &quot;cl &lt; demo.txt&quot;.
 
 (load &quot;parser.cl&quot;)
 (load &quot;cgol.cl&quot;)
 
 #.(cgol)
 scripting $
 
 % C-style comments %
 % first some easy ones %
 1+1 $
 2*3/6 $
 % assignment %
 a:= 7 $
 b:= a*7 $
 
 % try out operator precedence %
 2*3/6 $
 100+3*5 $
 100*3+5 $
 % should be 47 % 2+2+6*7+7/7 $ 
 % floats use same arithmentic operators %
 2+95.3/7.25 $
 
 % can return value of arbitrary element in sequence %
 
 2+2 ; 3+3 ; 4+4 $
 2+2 &amp; 3+3 ; 4+4 $
 2+2 ; 3+3 &amp; 4+4 $
 
 eval $ % turn off evaluation to avoid undef&#39;ed variables %
 % if&#39;s compose nicely %
 if (a&lt;b) then
 if (a&lt;c) then a
 else if (b&lt;c) then b
 else c $
 
 % try some Lisp operators %
 [12,4,3,5,6] $
 a^b @c$
 \a,b,c; p;q;r $
 % escape into Lisp directly %
 !(make-array &#39;(100 2) :element-type &#39;integer) $
 eval $
 4 isin [12,4,3,5,6] $
</pre>


<p>
ほかにも Dylan などは S 式を捨てて ALGOL ライクな構文を導入することで普及を目指しました。
現在でも Lisp に S 式以外の構文を持たせようとする試みは Lisp を学ぶ者が誰でも一度は挑戦する定番の課題となりました <sup><a href="#fn.1" name="fnr.1" class="footref">1</a>
</sup>
_ 。
comp.lang.lisp には毎年一度は確実にその手を話題が投稿されます。
「C/Python/Ruby ライクな構文シュガーを考えたんだ!!」
「C++ みたいにドットでメソッド呼び出しを書けるマクロをつくったよ!!」
などです 。
</p>

<p>
自分の経験だけでも、「メソッド呼び出しを C++ 風に（C/C++ から入ってきたので）」「インデントで構造を表す（Python の影響）」「後置記法に (forth の影響)」「区切記号の活用 (<code>(f3 (f2 (f1))) -> f1 | f2 | f3</code>
)」などやりましたが、どれも精々ユーザーインターフェースの一貫としてちょっと使ったくらいで、自分でプログラミングするための S 式を完全に置きかえるには至りませんでした <sup><a href="#fn.2" name="fnr.2" class="footref">2</a>
</sup>
_ 。
</p>



<blockquote>

<p>
リーダーマクロなどがある所為か、Common Lisp の界隈では特にその傾向が強いように思います。まぁ、 Scheme も SRFI でインデントベースの表記法を規定しているので結局皆考える事は一緒なのでしょうが…
</p>

<p>
S 式の表示を視覚的に工夫する試みも、学生の研究から Emacs での 「S 式を強調する 5 つの方法 : <a href="http://lemonodor.com/archives/001207.html">Five Approaches to S-Expression Highlighting</a>
 」までいろいろあります。
</p>



</blockquote>


<p>
CGOL から数十年が立ち、多くの試みがなされましたが、 Lisp 使いは結局今も S 式をつかっています。なぜでしょうか？
曰く「優れた Lisp 使いには括弧が気にならなくなる」「インデントで構造は読むので」などなど諸説あります。
中には「Lisp 脳になると括弧が気持ち良くなる」といった胡散臭いもまである始末。
個人的な感想からいうと、Lisper は <b>S 式の利点</b>
 を理解して <b>便利だから</b>
 使っているのであって、
もしこれよりも編集しやすく読みやすく、表現力に富む記法が開発されれば喜んで S 式を捨てるでしょう。
</p>

<p>
Lisp を勉強するほぼすべての人は、S 式の代替となる表現を考えようと試みます。
そして、ある程度の経験を積めばそれは実現できます。
しかし、それは <b>S 式の利点</b>
 を 100% 引き継げない場合がほとんどなのです。
</p>

<p>
しかし、自分の体験に照し合わせてみると、この <b>S 式の利点</b>
 は文章を読んだだけえは実感できませんでした。
自分の経験を思い出してみれば、最初は師匠の操作を後からのぞいてその編集操作のカーソルの奇妙な動きを観察してたものです。
現在は昔に比べれば圧倒的に Web で簡単に Lisp の情報は手に入りますが、この「S 式の便利さ」の編集部分を目にする機会は
依然として少ないように思います。
というわけで、マクロやプログラム==データなどいろいろ小難しく聞こえる S 式のメリットは
よく見かけますが、「編集が楽」に関しては「Emacs を使えば楽」という程度の説明で
あっさり終ってしまう場合が多いように思います。そこで、今回は括弧の編集における利点を解説してみようと思います。
</p>

]]></description></item><item><title> 作って学ぶ Lisp (1)  超やさしいLispインタプリタの作り方</title><pubDate>2006-12-08 03:54:00</pubDate><link>http://lispuser.net/memo/lisp/2006-12-08-03-54.html</link><description><![CDATA[<div class="outline-2" id="outline-container-2">
<h2 id="sec-2"> 作って学ぶ Lisp (1)  超やさしいLispインタプリタの作り方</h2>
<div id="text-2">

<p> 
</p>



<center>

<p>
<b>この記事は書きかけです</b>

</p>



</center>


<p>
Lisp 普及を目指しているのに、まず入門記事がないのはどうよ？とか言われて、
グサっときたので。他の言語の入門記事より Lisp の特徴を前面に出していこ
うということで、「Lisp を作りながら Lisp を学ぶ」を目指します。
いま入手できる Lisp 処理系ってほんとうに良くできているものが多いのですが、
自分でつくってみると、「本物」のすごさが良くわかるようになるでしょう。
</p>

<p>
ネタ元： Java で 500 行の Lisp にインスパイアされました。
</p>

<p>
<a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20060922/248738/">http://itpro.nikkeibp.co.jp/article/COLUMN/20060922/248738/</a>
  (<a href="http://d.hatena.ne.jp/textfile/20061204/lisp">http://d.hatena.ne.jp/textfile/20061204/lisp</a>
 経由)
</p>

<p>
ちょっと探してみると <a href="http://tociyuki.cool.ne.jp/archive/index.html">http://tociyuki.cool.ne.jp/archive/index.html</a>
 とか
<a href="http://www.biostat.wisc.edu/~annis/creations/PyLisp/">http://www.biostat.wisc.edu/~annis/creations/PyLisp/</a>
 とかありますが、 Lisp をやるなら Lisp がいちばん!!
</p>

<p>
100 行程度で超シンプルな Lisp インタプリタを作成してみます。
オリジナルの Java 版と同様にマクロはないですが、短かくてもちゃんとクロージャは備えています。
(Lisper な人には断わっておきますが、 Lisp-1 です)
</p>

]]></description></item><item><title> 祝 SBCL 1.0 リリース、と最近の SBCL, CLISP, SLIME などの CVS 版の情報</title><pubDate>2006-12-07 04:54:00</pubDate><link>http://lispuser.net/memo/lisp/2006-12-07-04-54.html</link><description><![CDATA[<div class="outline-2" id="outline-container-3">
<h2 id="sec-3"> 祝 SBCL 1.0 リリース、と最近の SBCL, CLISP, SLIME などの CVS 版の情報</h2>
<div id="text-3">

<p> 
</p>

<p>
めでたく SBCL 1.0 がリリースされました!! …が、他のニュースサイトに
遅れること一週間。個人的目玉は
</p>

<ul>
<li>
NIIMI Satoshi さんによる FreeBSD/x86 スレッドサポート (!!) や浮動小数
点例外の改善、Shift-JIS external format サポート。SBCL ユーザー
は NIIMI さんにみんなで感謝しましょう。

</li>

</ul>


<p>ですが、今さら新機能を羅列しても独自色がでないので 1.0 以降の情報をば。
SBCL CVS 版では↓のような結構大きな変更がはいってます。
</p>

<ul>
<li>
ユーザーが拡張可能な SEQUENCE 型
</li>

<li>
クロスリファレンス機能 (SLIME から利用可能になってます)

</li>

</ul>


<p>CLISP CVS 版では、gtk モジュールが導入されてます。Glade でデザインし
た xml を読み込んで使えるようになるらしく、CLISP での GUI 環境の改善
に役立つかもしれません。今後の動向が注目されます。
</p>

<p>
SLIME は 12 月初旬頃の CVS から <code>swank::*coding-system*</code>
 の書式が
キーワードから文字列にかわりました。古い .slime.lisp を使っていると
エラーになるので注意してください。
</p>

<pre class="example">
;; (setq swank::*coding-system* :utf-8-unix) ; old style
(setq swank::*coding-system* &quot;utf-8-unix&quot;) ; new style
</pre>


<p>
また SBCL 1.0.0.18 から入ったクロスリファレンス (xref) がサポートされる
ようになっています。
</p>
</div>

</div>
]]></description></item><item><title> 「なるほど!」と思った瞬間 in Lisp</title><pubDate>2006-11-09 23:32:00</pubDate><link>http://lispuser.net/memo/lisp/2006-11-09-23-32.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> 「なるほど!」と思った瞬間 in Lisp</h2>
<div id="text-1">

<p> 
</p>

<p>
ちょっと古いネタですが comp.lang.lisp での Zach Beane の投稿。途中まで
訳して、「後で訳す」になっていたのだがlemonador.com に取り上げられてい
たので続きをやってみました。
</p>

]]></description></item><item><title> SEND + MORE = MONEY</title><pubDate>2006-11-04 00:11:00</pubDate><link>http://lispuser.net/memo/lisp/2006-11-04-00-11.html</link><description><![CDATA[<div class="outline-2" id="outline-container-2">
<h2 id="sec-2"> SEND + MORE = MONEY</h2>
<div id="text-2">

<p> 
</p>

<p>
ネタがないので <a href="http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3a%e6%95%b0%e9%81%8a%e3%81%b3">http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3a%e6%95%b0%e9%81%8a%e3%81%b3</a>
 よりパズルに挑戦。
</p>

<pre class="example">
  S E N D
+ M O R E
---------
M O N E Y     (S, M != 0 かつ S, E, N, D, M, O, R, Y はユニークな 0..9 の整数)
</pre>



<p>
まず欲しい関数を考える。↓のような感じでズバっと解答がほしい。
</p>

<pre class="example">
CL-USER&gt; (solve &quot;SEND&quot; &quot;MORE&quot; &quot;MONEY&quot;)
SEND + MORE = MONEY
???? + ???? = ?????
CL-USER&gt; 
</pre>


<p>
全組み合わせを考えるとー 10 個の数値から 8 個を取り出すんだから (* 10
9 8 7 6 5 4 3) で 1814400 程度かな？この程度であれば、探索時間はあまり
問題にならないような気もするけれど、メモリはどうかなー。全リストを返す
と、たとえば S, E, N, D, M, O, R, Y を fixnum のリストで表現したとして
コンスセルで 8 セル。CAR, CDR がそれぞれ 4 バイトとして、文字に対応する
数値のリストが 8 x 8 = 64 バイト。全部 collect すると、
</p>

<pre class="example">
64 バイト * 1814400 通り = 116,121,600 バイト = 100MB
</pre>


<p>
これは、現在メモを書いている Lisp 環境 (CLISP on coLinux メモリ 256MB
割り当て) では厳しそうなので、パターンをリストにあつめてから map する
方向ではなく、パターンを生成したらそれを引数に関数を呼び出すようにしよう。
</p>

<pre class="example">
;; こんなつもり
(combinations fn 0..9 8)
=&gt; (funcall fn &#39;(8 7 6 5 4 3 2 1 0))
=&gt; (funcall fn &#39;(9 7 6 5 4 3 2 1 0))
=&gt; (funcall fn &#39;(7 8 6 5 4 3 2 1 0))
...
=&gt; (funcall fn &#39;(1 2 3 4 5 6 7 8 9))
</pre>


<p>
で、このリストの数字と文字との対応をとって SEND + MORE = MONEY を満すか
どうかを検査する、と。
</p>

]]></description></item><item><title> SBCL 0.9.17 と CLISP 2.41 リリース</title><pubDate>2006-10-19 23:38:00</pubDate><link>http://lispuser.net/memo/lisp/2006-10-19-23-38.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> SBCL 0.9.17 と CLISP 2.41 リリース</h2>
<div id="text-1">

<p> 
</p>

<p>
いつのまにやら SBCL 0.9.17 と CLISP 2.40, 2.41 がリリースされてます。
</p>

<p>
SBCL は <b>weak hash の実装</b>
 と <b>Windows用インストーラの試験版</b>
 、FFI
の External-format サポート、CLISP は <b>SLIME で関数の引数名が表示されるようになった</b>

のと <b>libsvm サポート</b>
 が主要な変更点です。
</p>

<p>
今迄 CLISP ではコンパイルされた関数は引数の名前を保持しておらず、arg0
arg1  のような表示になっていたのですが、今回から最適化オプション
space の値を設定することによりパラメータ名を保持するようになりました。
2.40 以前を使っている人は、さっそく 2.41 に更新しましょう。
</p>

<p>
<a href="http://lispuser.net/commonlisp/clisp.html">CLISP ごった煮版</a>
 も用意しました。詳細は <a href="http://lispuser.net/commonlisp/clisp.html">CLISP のページ</a>
 で。
</p>

]]></description></item><item><title> taskpad.jp みたいなのを AllegroServe + Webactions + AllegroCache でつくってみる [パクリ]</title><pubDate>2006-09-10 22:25:00</pubDate><link>http://lispuser.net/memo/lisp/2006-09-10-22-25.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> taskpad.jp みたいなのを AllegroServe + Webactions + AllegroCache でつくってみる [パクリ]</h2>
<div id="text-1">

<p> 
</p>

<p>
私が最初に見かけた  Catalyst のサンプルが
<a href="http://blog.woremacx.com/2005/09/taskpadjp.html"> taskpad.jp みたいなのを Catalyst で作ってみる</a>

でした．Catalyst の感じがつかめて非常に参考になりました．
</p>

<p>
そこで，最近入手した AllegroCL で似たような事をやってみようと思います．
まぁ，偉そうな事いいながらマニュアル片手に調べながらちまちま書いてるわ
けですが．
</p>

]]></description></item><item><title> Dired に拡張子ベースで色を付ける - dired + font-lock</title><pubDate>2006-08-30 23:06:00</pubDate><link>http://lispuser.net/memo/lisp/2006-08-30-23-06.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> Dired に拡張子ベースで色を付ける - dired + font-lock</h2>
<div id="text-1">

<p> 
</p>

<p>
Emacs 仲間が dired モードの場合に拡張子で色をつけたい，とボヤいていまし
た．で，調べたついでにここのネタにします．たしかに font-lock 周りの説明
は不足気味な上，dired の色付けに関するドキュメントはさらに少ないように
思います．
</p>

<p>
dired モードは Emacs の標準色付け機構 font-lock を使ってディレクトリや
マークなどの操作に対応したハイライトをしています．dired がやっているの
は実際には font-lock 用の正規表現とフェイスを設定しているだけで実際に色
をつけているのは font-lock 機構です．おおまかに説明すると
</p>

<pre class="example">
[dired-mode 起動時]
1. dired 起動
2. dired-mode 関数が呼ばれる
3. バッファローカルの変数 font-lock-defaults に dired-font-lock-keywords を指定
</pre>


<p>
したがって，dired-font-lock-keywords を通じてカスタマイズが可能です．で
は，dired.el の dired-font-lock-keywords 定義を見てみましょう……と思っ
たんですが，はい，長いですね．カスタマイズ用の関数を用意しました．
</p>

<pre class="example">
(defvar *original-dired-font-lock-keywords* dired-font-lock-keywords)
(defun dired-highlight-by-extensions (highlight-list)
  &quot;highlight-list accept list of (regexp [regexp] ... face).&quot;
  (let ((lst nil))
    (dolist (highlight highlight-list)
      (push `(,(concat &quot;\\.\\(&quot; (regexp-opt (butlast highlight)) &quot;\\)$&quot;)
              (&quot;.+&quot; (dired-move-to-filename)
               nil (0 ,(car (last highlight)))))
            lst))
    (setq dired-font-lock-keywords
          (append *original-dired-font-lock-keywords* lst))))
</pre>


<p>
使い方は次の通りです．
</p>

<pre class="example">
(dired-highlight-by-extensions
  &#39;((&quot;txt&quot; font-lock-variable-name-face)
    (&quot;odql&quot; &quot;tmpl&quot; font-lock-type-face)
    (&quot;lisp&quot; &quot;el&quot; &quot;pl&quot; font-lock-constant-face)))
</pre>


<p>
色づけを変更したい場合は再度 dired-highlight-by-extensions を呼び出して
ください．
</p>

<p>
このように <code>(拡張子 [拡張子] ... フェイス)</code>
 という形式のリストでファ
イル名を拡張子に応じて色付けします．ただ，ファイル数が遅いと性能にモロ
に効いてきますので使いすぎには御注意下さい．:-)
</p>

]]></description></item><item><title> 日常的な Lisp</title><pubDate>2006-08-20 03:10:00</pubDate><link>http://lispuser.net/memo/lisp/2006-08-20-03-10.html</link><description><![CDATA[<div class="outline-2" id="outline-container-2">
<h2 id="sec-2"> 日常的な Lisp</h2>
<div id="text-2">

<p> 
</p>

<p>
泥くさい例もあったほうが宣伝になるかと思い ~/bin の中から公開しても差し
使えないような <a href="http://lispuser.net/commonlisp/util.html">小物 Lisp プログラム</a>
 を公開．
</p>

<pre class="example">
(defpackage :mkindex (:use :cl :indexer))
(in-package :mkindex)

(define-root (merge-pathnames &quot;doc&quot; (user-homedir-pathname)))

(define-category &quot;Lisp Resources&quot;
    :link &#39;((&quot;Common Lisp Hyper Spec&quot; &quot;./HyperSpec/Front/index.htm&quot;)
           (&quot;Common Lisp The Language 2nd Edition&quot; &quot;./cltl/cltl2.html&quot;)
           (&quot;Practical Common Lisp&quot; &quot;./web/www.gigamonkeys.com/book/index.html&quot;)
           (&quot;Paul Graham&quot; &quot;./web/www.paulgraham.com/index.html&quot;)
           (&quot;Dream Songs&quot; &quot;./web/www.dreamsongs.com/index.html&quot;)
           (&quot;Pascal Contanza&quot; &quot;./web/p-cos.net/index.html&quot;)
           (&quot;Structure and Interpretation of Computer Programms&quot;
         &quot;./web/www-mitpress.mit.edu/sicp/index.html&quot;)
           (&quot;SICM&quot; &quot;web/swiss.csail.mit.edu/~gjs/6946/sicm-html/index.html&quot;)
           ))

(define-category &quot;Other Documents&quot;
  :link &#39;((&quot;PostgreSQL 8.1 (ja)&quot; &quot;./postgres/index.html&quot;)
         (&quot;Statistics with R&quot; &quot;./web/zoonek2.free.fr/UNIX/48_R/all.html&quot;)
         (&quot;Perl and Shift_JIS&quot; &quot;http://homepage1.nifty.com/nomenclator/perl/index.htm&quot;)
         (&quot;Perl Hints&quot; &quot;http://www.geocities.co.jp/SiliconValley-Oakland/4080/&quot;)
         (&quot;Perl and Unicode&quot; &quot;http://www.lr.pi.titech.ac.jp/~abekawa/perl/index.html&quot;)
         ))

(define-category &quot;Maxima Documents&quot;
    :pred (filter :directory &quot;lisp&quot; :filetype &quot;pdf&quot;))

(define-category &quot;PDF Documents&quot;
    :pred (filter :directory &quot;ebook&quot; :filetype &quot;pdf&quot;))

(define-category &quot;CHM Documents&quot;
    :pred (filter :directory &quot;ebook&quot; :filetype &quot;chm&quot;))

(generate-index)
</pre>


<p>
ただ HTML 作るだけなんですねどね…。
</p>

</div>


</div>
]]></description></item><item><title> Lisp Machine のマニュアル</title><pubDate>2006-08-17 19:30:00</pubDate><link>http://lispuser.net/memo/lisp/2006-08-17-19-30.html</link><description><![CDATA[<div class="outline-2" id="outline-container-3">
<h2 id="sec-3"> Lisp Machine のマニュアル</h2>
<div id="text-3">

<p> 
</p>

<p>
Lisp マシンのマニュアルが HyperText 形式で公開されています!!
</p>

<pre class="example">
http://bknr.net/static/lmman/frontpage.html
</pre>


<p>
現在の dynamic-extent による最適化と同等の機能が組み込まれています．ヒー
プ上ではなくスタック上にリストを確保する事により GC の手間を省く機能の
ようです．
</p>

<pre class="example">
http://bknr.net/static/lmman/fd-con.xml#stack-list-section
</pre>


<p>
コルーチンやジェネレーターなどが当時からメジャーな手法だった事がわかり
ます．この機能は Common Lisp にないですねぇ．
</p>

<pre class="example">
http://bknr.net/static/lmman/fd-sg.xml#Resuming%20of%20Stack%20Groups-section
</pre>


<p>
当時の LOOP マクロ!!
</p>

<pre class="example">
http://bknr.net/static/lmman/looptm.xml
</pre>



<p>
CLOS に影響を与えたオブジェクトシステム FLAVORS !! 聞いたことはありま
したが，こーゆう感じだったんですねー．
</p>

<pre class="example">
http://bknr.net/static/lmman/flavor.xml
</pre>


<p>
<code>(send オブジェクト メッセージ)</code>
 という形式ですが，すでに多重継承や総
称関数など現代に通じる機能が見られますね．（Allegro Common Lisp には後
方互換のために flavors がまだ附属しています）
</p>

<p>
Lisp マシンのネットワーク機能 Chaosnet です．当時は今のように標準化され
た規格がなく，ごちゃまぜの複数規格が混沌としていたため，この名前が付い
たとか聞いたことがあります．
</p>

<pre class="example">
http://bknr.net/static/lmman/chaos.xml
</pre>


<p>
その他便利なユーティリティ関数．documentation, ed, dribble などは
Common Lisp 規格にありますね．その他の metering や who-call などは処理
系の拡張ライブラリの定番ですね．
</p>

<pre class="example">
http://bknr.net/static/lmman/fd-hac.xml
</pre>


<p>
ほかにもコンパイラの章には現代のコンパイラマクロの前身のような機能や開
発環境との連携を前提とした機能など Lisp Machine ならではの機能が記述さ
れています．並列処理用機能 Processes などは現代の各種処理系の
MultiProcessing パッケージに似ています．How To Read Assembly Language
なんて章があるあたりハッカー精神を感じますね．
</p>



</div>


</div>
]]></description></item><item><title> RT 3.6.0 - Request Trakcer を導入</title><pubDate>2006-08-04 21:59:00</pubDate><link>http://lispuser.net/memo/lisp/2006-08-04-21-59.html</link><description><![CDATA[<div class="outline-2" id="outline-container-4">
<h2 id="sec-4"> RT 3.6.0 - Request Trakcer を導入</h2>
<div id="text-4">

<p> 
</p>

<p>
Bugzilla や影舞など BTS もいろいろありますが，うちでは実績と伝統のある
RT をつかってます．<a href="http://www.bestpractical.com/">http://www.bestpractical.com/</a>
 より最新の
rt-3.6.0.tar.gz などはだいぶ見た目も現代的になってきて良いかんじです．
（この見た目の変更は 3.5 以降のものですので，3.4 以前使っている人にしか
わかりませんが…）
</p>

<p>
が，たとえば更新に失敗すると，一瞬にして「ほらみろ．なんでも IT とか言
うから （中略） やっぱ Excel による台帳管理だな!!」という具合に底辺環境
までレベルダウンしてしまいそうなので更新はしくじれません．そんなわけで，
まず個人の環境から更新してみます．
</p>

]]></description></item><item><title> CLISP 2.39 リリース : CLISP + SLIME + LTK パッケージ公開</title><pubDate>2006-07-22 21:42:00</pubDate><link>http://lispuser.net/memo/lisp/2006-07-22-21-42.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> CLISP 2.39 リリース : CLISP + SLIME + LTK パッケージ公開</h2>
<div id="text-1">

<p> 
</p>

<p>
リリースノート翻訳 ( <a href="http://sourceforge.net/project/shownotes.php?release_id=432725&amp;group_id=1355">原文</a>
)，ついでに Takashi Hiromatsu さんの
<a href="http://homepage.mac.com/matsuan_tamachan/emacs/NtemacsBinaries.html">NTEmacs のバイナリ</a>
 と組み合わせて簡単に 
<a href="http://lispuser.net/commonlisp/clisp.html">CLISP + SLIME + LTK による GUI までを体験できるパッケージ</a>

を用意しました．詳しくは <a href="http://lispuser.net/commonlisp/clisp.html">CLISP のページ</a>

を御覧ください. 手軽にフルセットの Lisp 開発環境が体験できます!! Happy Hacking!!
</p>

<p>
今回は何気に <b>Win32 上での I/O の高速化</b>
 が大きいと思います．
</p>

]]></description></item><item><title> 典型的な Greenblat のコード</title><pubDate>2006-06-25 10:20:00</pubDate><link>http://lispuser.net/memo/lisp/2006-06-25-10-20.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> 典型的な Greenblat のコード</h2>
<div id="text-1">

<p> 
</p>

<p>
ふと思い出したので， comp.lang.lisp の <a href="http://groups.google.co.jp/group/comp.lang.lisp/browse_frm/thread/e27c2c901a37151d/cb0b705ced20e40f">new to lisp</a>
 というスレッドで
紹介されていたネタを．
</p>

<p>
最初は Lisp 初心者の質問に答えるという通常の流れなのですが，最初は定番の
ネタ （SICP の紹介とか） なんですが，途中からおもしろくなってきます．
</p>



<blockquote>
<p>
やー，それらは良いプログラムかもしれないね．でも私は Lisp を初める初心
者にとって本当に良いアドバイスなのかいまだに確信がもてません．私が書い
て，実行できた最初のプログラムは次のようなものでした
</p>

<pre class="example">
10 PRINT &quot;HELLO&quot; 
20 GOTO 10 
</pre>



<p>
それは次のようになるでしょう
</p>

<pre class="example">
(TAGBODY 
 10 (PRINT &#39;HELLO) 
    (GO 10)) 
</pre>


<p>
<code>:-)</code>

</p>



</blockquote>


<p>
という記事から BASIC ライクな手続きの話に．そこで，Joe Marshall 氏の衝
撃の発言が．
</p>

]]></description></item><item><title> SHALLOW-COPY : Meta Object Protocol の利用例 : オブジェクトをコピーする</title><pubDate>2006-06-03 22:40:00</pubDate><link>http://lispuser.net/memo/lisp/2006-06-03-22-40.html</link><description><![CDATA[<div class="outline-2" id="outline-container-2">
<h2 id="sec-2"> SHALLOW-COPY : Meta Object Protocol の利用例 : オブジェクトをコピーする</h2>
<div id="text-2">

<p> 
</p>

<p>
Lisp に興味のある方ならば，MOP : Meta Object Protocol を聞いた事がある
と思います．最近は CLISP でも実装されており，ほぼ全ての Common Lisp 処
理系で利用可能になっています．一ユーザーとしてどのようなメリットがある
かを考えてみます．
</p>

<pre class="example">
cs-user&gt; (defclss node () ((title :initarg :title) (data :initarg :data)))
; Evaluation aborted
cs-user&gt; (defclass node () ((title :initarg :title) (data :initarg :data)))
#&lt;standard-class node&gt;
cs-user&gt; (defvar a)
a
cs-user&gt; (defvar b)
b
cs-user&gt; (setq b (make-instance &#39;node :title &quot;Data 1 - COPY&quot; :data &#39;(1 2 3)))
#&lt;node #x20EA5A56&gt;
cs-user&gt; a
#&lt;node #x20E9053E&gt;
cs-user&gt; b
#&lt;node #x20EA5A56&gt;
cs-user&gt; 
</pre>


<p>
さて，A の中身を表示したいと思いませんか？あるいは，データのコピーを簡
単に作りたいという要望もあるでしょう．真っ先に考えつくのは以下のような
ものです．
</p>

<pre class="example">
(defmethod show ((obj node))
  (with-slots (title data)
     node
     (format t &quot;TITLE: ~A~&amp;DATA: ~A~&amp;&quot; title data)))  
</pre>


<pre class="example">
(defmethod shallow-copy ((obj node))
  (make-instance &#39;node
                 :title (if (slot-boundp obj &#39;title) (slot-value obj &#39;title) nil)
                 :data  (if (slot-boundp obj &#39;data) (slot-value obj &#39;data) nil)))
</pre>


<p>
しかし，これは node クラスの定義が変更されるたびにメンテナンスが必要に
なります．スロットが追加されたら？名前がわったら？そう，メソッドも変更
が必要になるのです．この問題を Meta Object Protocol を使って解決してみ
たいと思います．
</p>

]]></description></item><item><title> Emacs と全文検索  Hyper Estraier を使う</title><pubDate>2006-05-18 05:49:00</pubDate><link>http://lispuser.net/memo/lisp/2006-05-18-05-49.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> Emacs と全文検索  Hyper Estraier を使う</h2>
<div id="text-1">

<p> 
</p>

<p>
howm の記事やメールなどが増えてきて探すのが面倒になってきたので全文検索
の導入を考えはじめました．まず Hyper Estraier がよさそうなので，評価も
とりあえずなんとか検索できるような Emacs Lisp ででっちあげました．
</p>


</div>


<div class="outline-3" id="outline-container-1.1">
<h3 id="sec-1.1">設定</h3>

<div id="text-1.1">


<ol>
<li>
HyperEstraier をインストールする (estcmd にパスが通っている事)
</li>

<li>
hyperestraier-config を設定する
<ul>
<li>
:linux プラットフォーム
<ul>
<li>
:howm 種別
<ul>
<li>
:index インデックスのディレクトリへのパス
</li>

<li>
:create インデックス作成時のコマンド
</li>

<li>
:update インデックス更新時のコマンド

</li>

</ul>

</li>

</ul>

</li>

</ul>

</li>

</ol>


<p>この設定の部分でインチキ臭ささが酷いですね．なんと NTEmacs でも動かした
い，かつ，ファイルの指定は <code>find ... |grep</code>
 のように指定したかったと
いう個人的要望で，なんと .bat というバッチファイルを生成してシェルから
実行するという手抜きっぷりです．
</p>

</div>


</div>


<div class="outline-3" id="outline-container-1.2">
<h3 id="sec-1.2">使い方</h3>

<div id="text-1.2">


<pre class="example">
M-x hyperestraier-make-index
   種別を聞いてくるので、答えるとインデックスを作成する (:create で指定したコマンドラインを呼び出すだけ)

M-x hyperestraier-update-index
   種別を聞いてくるので、答えるとインデックスを作成する (:search で指定したコマンドラインを呼び出すだけ)

M-x hyperestraier-search
   種別、検索フレーズ、結果の表示方法を指定して検索する (:index で指定した場所のインデックスを検索する)
</pre>


</div>


</div>


<div class="outline-3" id="outline-container-1.3">
<h3 id="sec-1.3">ToDo</h3>

<div id="text-1.3">


<ul>
<li>
検索結果バッファ用のモードを用意する (考えてるのは↓のような簡易的なもの)

<ul>
<li>
p: 前の検索結果へ
</li>

<li>
n: 次の検索結果へ
</li>

<li>
v: 検索結果のファイルを開く  とか？

</li>

</ul>

</li>

<li>
Mew との連係

<ul>
<li>
タグによる分類とかつけたいので結局 C で HyperEstraier の API を利用する

</li>

</ul>

</li>

</ul>


]]></description></item><item><title> CL-Prevalence : Common Lisp で Object Prevalence</title><pubDate>2006-04-26 03:02:00</pubDate><link>http://lispuser.net/memo/lisp/2006-04-26-03-02.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> CL-Prevalence : Common Lisp で Object Prevalence</h2>
<div id="text-1">

<p> 
</p>

<p>
データを保存したくて CFFI 使って GDBM とのインターフェースを書いていた
んですが，オブジェクトを保存したいケースにでくわして，CL-Store 使うか…
とおもったところで，CL-Prevalence の事を思いだしました．インストールし
ただけで使ってなかったんですが，使ってみたら非常に便利でした．
</p>


</div>


<div class="outline-3" id="outline-container-1.1">
<h3 id="sec-1.1">CL-PREVALENCE 概要 (翻訳)</h3>

<div id="text-1.1">


<p>
<a href="http://common-lisp.net/project/cl-prevalence/">CL-PREVALENCE</a>
 とは <a href="http://homepage.mac.com/svc">Sven Van Caekenberghe</a>
 氏による
<a href="http://www.prevayler.org/">ObjectPrevalence</a>
_ の Common Lisp 実装です． <a href="http://common-lisp.net/project/cl-prevalence/">CL-PREVALENCE</a>
 は
<a href="http://common-lisp.net/project/s-xml/">S-XML</a>
 を使用した XML シリアライズプロトコルを用いています．また，よ
り Lisp ライクな S 式ベースのシリアライズプロトコルも存在します．
</p>

<p>
Object Prevalence 2001 年に Klaus Wuestefeld によって提案された，シンプ
ルでかつ興味深いコンセプトを持った技術です．IBM developerWorks にわかり
やすい <a href="http://www-106.ibm.com/developerworks/library/wa-objprev/">入門記事</a>
 があります．Java による主な実装は <a href="http://www.prevayler.org/">Prevayler</a>
 と呼
ばれており，Wiki サイト（雑然としています）に多くの情報と活発な議論があ
ります．Object Prevalence の主要な特徴のほとんどは学術論文
<a href="http://birrell.org/andrew/papers/024-DatabasesPaper.pdf">A Simple and Efficient Implementation for Small Databases</a>

(Birrell, Jones, and Wobber <sup><a href="#fn.1987" name="fnr.1987" class="footref">1987</a>
</sup>
) で説明されています．
基本的なアイデアは以下のようなものです．
</p>

<ul>
<li>
ほとんどのデータベースは，数百メガバイト程度のサイズしかないか，それよりも小さい
</li>

<li>
ほとんどのコンピュータは数百メガバイトのデータを RAM 上で操作できる．（大きなサーバなら数ギガバイト程度のデータを扱える）
</li>

<li>
オブジェクトをデータベースにマッピングするのは退屈で時間の無駄であるばかりか，複雑になったりエラーがでたりしやすい
</li>

<li>
データベースを捨てて，ドメインモデルオブジェクトをデーターベースとして使用することにしましょう
</li>

<li>
オブジェクトをファイルシステムのような永続領域にシリアライズしたり，デシリアライズして永続領域からオブジェクトを取り出せるようにしましょう
</li>

<li>
もしドメインモデルオブジェクトの完全な集合を永続領域の保存したいなら，スナップショットを作りましょう
</li>

<li>
クエリーとしてプログラム言語のデータ構造操作機能を使います．RAM 内のデータに対しては非常に高速ですから．
</li>

<li>
データとトランザクションを実行する関数を結びつけたトランザクションオブジェクトを使ったオブジェクトモデルを理解してください
</li>

<li>
ACID 属性を確保するために，それぞれのトランザクションを実行した後に，シリアライズして永続化します．これを **トランザクションログ** と呼びます．
</li>

<li>
意図したか意図していないかに関わらず，システムがシャットダウンした時には，最初に最新のスナップショットをロードし，それぞれのトランザクションログを再実行してリストアします
</li>

<li>
トランザクションは決定的で，かつ，リエントラントでなければなりません (そして，必要ならば時刻を記録しておく必要があります)
</li>

<li>
マルチスレッドシステムでは，トランザクションはグローバルにシリアライズされます

</li>

</ul>


<p>これで Object Prevalence のコンセプトはすべてです．利点と制限事項の詳細は以下の通りです．
</p>

<ul>
<li>
最近のコンピュータの実装は優れているため，一秒間に数千トランザクションを実施し，また同じ速度でそれをリカバリーできます
</li>

<li>
トランザクションはシステムをブロックするため，短時間で完了しなければなりません - 全てが RAM 上にある間は対した問題ではありません
</li>

<li>
完全に一貫したシテム状態を必要とするクエリーは，システムをブロックしなければなりません - さほどクリティカルでないクエリーは並列に実行できます
</li>

<li>
実用上，トランザクションを実行する時にはまずシステムの状態をチェックし，必要ならエラーを返す必要があります．全てが一貫している時にのみシステムに変更を加えるようにします．トランザクション中は単独のスレッドのみがアクティブにならなければなりません．クエリーは可能なかぎり高速にデータを取得できます．この実装ではトランザクションは実行が成功した後に記録されます．
</li>

<li>
この実装ではトランザクション中に予期しないエラーに遭遇した場合に，（システムをリストアする事による）ロールバックが選択できます．トランザクション中でエラーが発生した場合に false を返す（ もしくは <code>no-rollback-error</code>
 や，それを継承する事により）ロールバックするかどうかの条件を指定する事ができます．
</li>

<li>
長時間に渡るトランザクションは問題となります
</li>

<li>
マスタとなるトランザクションログをレプリカに送ることにより，簡単にレプリケーションやクエリーのロードバランシングが可能です．また，バックアップやフェイルオーバーも実現できます．しかし，この実装はレプリケーションをまだ含んでいません．

</li>

</ul>


<p>CL-PREVALENCE のコードは <a href="http://homepage.mac.com/svc">Sven Van Caekenberghe</a>
 によって書かれました．
</p>

</div>


</div>


<div class="outline-3" id="outline-container-1.2">
<h3 id="sec-1.2">日本語コンテンツ</h3>

<div id="text-1.2">



</div>


<div class="outline-4" id="outline-container-1.2.1">
<h4 id="sec-1.2.1">CL-PREVALENCE サンプルコード</h4>

<div id="text-1.2.1">


<pre class="example">
(defparameter *prevalence-directory* (merge-pathnames #p&quot;./Local Settings/Temp/&quot; (user-homedir-pathname)))
(defclass &lt;Entry&gt; ()
  ((id :initarg :id)
   (name :initarg :name)
   (link :initarg :link)))
</pre>


<pre class="example">
(defun test-1 ()
  (let* ((system (cl-prevalence:make-prevalence-system *prevalence-directory*)))
    (setf (cl-prevalence:get-root-object system :entries) (make-hash-table :test #&#39;equal))
    (let ((entries (cl-prevalence:get-root-object system :entries)))
      (dotimes (i 100)
        (setf (gethash i entries) (make-instance &#39;&lt;Entry&gt;
                                                 :id i
                                                 :name (format nil &quot;１６進数：0x~X&quot; i)
                                                 :link (gethash (- i 1) entries)))))
    (cl-prevalence:snapshot system)))
</pre>


<pre class="example">
(defun test-2 ()
  (let* ((system (cl-prevalence:make-prevalence-system *prevalence-directory*))
         (entries (cl-prevalence:get-root-object system :entries))
         (keys (loop for k being the hash-keys of entries collect k)))
    (dolist (k (sort keys #&#39;&lt;))
      (let ((v (gethash k entries)))
        (with-slots (id name link)
            v
          (format t &quot;~&amp;key: ~A =&gt; object: ~A (id:~A, name: ~A, link: ~A)~%&quot; k v id name link))))))
</pre>


<p>
<code>test-1</code>
 関数でルートオブジェクトとしてハッシュを容易し，そのハッシュに
登録しておくだけで DBM ライクな使い方ができるようになります．しかも，文
字列以外のオブジェクトを簡単に登録できます．
</p>

<p>
LispWorks 4.4.6 for Windows での Object Prevalence のサンプルを作成してみます．
</p>

]]></description></item><item><title> CFFI 入門 (2)</title><pubDate>2006-04-19 05:00:00</pubDate><link>http://lispuser.net/memo/lisp/2006-04-19-05-00.html</link><description><![CDATA[<div class="outline-2" id="outline-container-2">
<h2 id="sec-2"> CFFI 入門 (2)</h2>
<div id="text-2">

<p> 
</p>

<p>
つらつらと comp.lang.lisp への投稿を眺めていたところ，面白い記事を発見
しました．Writing machine code from LISP スレッドへの Frank Buss 氏の投稿
<a href="http://groups.google.com/group/comp.lang.lisp/msg/6d9cbc0fd337431b">http://groups.google.com/group/comp.lang.lisp/msg/6d9cbc0fd337431b</a>

です．なんと CFFI を使って配列を用意し，そこに機械語のコードを埋め込ん
で関数として呼び出してしまうという荒技です．
</p>

<p>
元の投稿はリストの合計値を求めているだけだったので，32 ビットでフィボナッ
チ数を求める処理にチャレンジしてみました．
</p>

<pre class="example">
;; フィボナッチ数計算
(defun fib (n)
  (loop with a = 0
        with b = 1
        repeat n
        do (psetf a b
                  b (+ a b))
        finally (return a)))
</pre>



<p>
これを機械語に変換します．いきなり機械語はキツいので，一旦アセンブラで
考えます．
</p>

<pre class="example">
;; フィボナッチ数計算 (アセンブラ)
[必須レジスタの保存]
;; パラメータ n を受けとる
movl 4(%ebp), %edx
;; a = 0
xor  %eax, %eax
;; b = 1
xor  %ebx, %ebx 
inc  %ebx
;; repeat n
LOOP:
test %edx, %edx
jz   END
dec  %edx
;; ループ内の処理
;; ecx レジスタに a+b の値を計算
mov ecx, eax
add ecx, ebx
;; a &lt;- b
mov eax, ebx
;; b &lt;- a+b
mov ebx, ecx
;; ループの処理
jmp  LOOP
 END:
[必須レジスタの復元]

</pre>


<p>
あとはこのコードに等しいベクタを作り，それを一引数の関数として呼び出します．
</p>

]]></description></item><item><title> CFFI 入門 (1)</title><pubDate>2006-04-16 04:32:00</pubDate><link>http://lispuser.net/memo/lisp/2006-04-16-04-32.html</link><description><![CDATA[<div class="outline-2" id="outline-container-3">
<h2 id="sec-3"> CFFI 入門 (1)</h2>
<div id="text-3">

<p> 
</p>

<p>
最近の Common Lisp 界では FFI の定番といえば <a href="http://www.cliki.net/CFFI">CFFI</a>
 のようです．
UFFI のプロジェクトも多いですが．
<a href="http://lambda.s55.xrea.com/Examples.html#ID46464924724D512424243F49454545496246303E2E3F74454024482553254325484E732448244E416A385F4A513439">昔書いたドキュメントの例</a>
 を CFFI で試してみました．
</p>

]]></description></item><item><title> 最高にキモい Lisp コードを書いてみよう with 100 行リーダーマクロ</title><pubDate>2006-03-30 23:58:00</pubDate><link>http://lispuser.net/memo/lisp/2006-03-30-23-58.html</link><description><![CDATA[<div class="outline-2" id="outline-container-1">
<h2 id="sec-1"> 最高にキモい Lisp コードを書いてみよう with 100 行リーダーマクロ</h2>
<div id="text-1">

<p> 
</p>

<p>
Ruby 方面でみかけたネタに触発されました．Lisp はプログラマブルな言語な
のでリーダーもプログラマブルです．そこでリーダーをいじって let や
defun などの構文を括弧じゃなくて end にでもしてみましょうか．
</p>

<p>
100 行程度を目標にトライしました．使ったライブラリは <a href="http://lispuser.net/commonlisp/cl-yacc.html">CL-Yacc</a>
 のみです．
できあがったのがこちら．
</p>

<pre class="example">
#@suck-lisp

defun fib (n)
  if (&lt; n 0)
    (error &quot;oops&quot;)
  elif (= n 0)
    0
  elif (= n 1)
    1
  else
    let
      x &lt;- (fib (- n 1))
      y &lt;- (fib (- n 2))
    in
      (+ x y)
    end
  end
end

defun f (lst)
  (print-lst lst)
end
    
defun print-lst (lst)
   when lst
      let
         x  &lt;- (car lst)
         xs &lt;- (cdr lst)
      in
         (print x)
         (print-lst xs)
      end
   end
end
    
defun walk (dir)
  let
     files &lt;- nil
     dirs &lt;- (cl-fad:list-directory dir)
  in
     (dolist (d dirs)
       if (cl-fad:directory-exists-p d)
          (setf files (append files (walk d)))
       else
          (push d files)
       end)
     files
  end
end

defun print-file-list ()
  (loop for e in (walk &quot;./&quot;) do (format t &quot;~A~&amp;&quot; e))
end
</pre>


<p>
これは Common Lisp です．括弧が足りなくない？とお疑いの人のために read
で読み込んでみます．
</p>

<pre class="example">
CL-USER&gt; (read-from-string &quot;#@suck-lisp
   
   defun fib (n)
     if (&lt; n 0)
       (error \&quot;oops\&quot;)
     elif (= n 0)
       0
     elif (= n 1)
       1
     else
       let
         x &lt;- (fib (- n 1))
         y &lt;- (fib (- n 2))
       in
         (+ x y)
       end
     end
   end&quot;)
(progn
(defun fib (n)
 (if (&lt; n 0) (progn (error &quot;oops&quot;))
  (if (= n 0) (progn 0)
   (if (= n 1) (progn 1)
    (progn (let ((x (fib (- n 1))) (y (fib (- n 2)))) (+ x y))))))))
276
CL-USER&gt; 
</pre>


<p>
いかにも機械変換な汚ないコードですが，ちゃんと S 式として読み取られてい
ます．
</p>

<p>
まぁ，これは小規模な例ですが実際には S 式を生のまま見せずにユーザーフレ
ンドリな形式を用意するのは良くある例です．そこで，今回は上記のミニ言語
をネタに <a href="http://lispuser.net/commonlisp/cl-yacc.html">CL-Yacc</a>
 入門です．
</p>

]]></description></item><item><title> Common Lisp で簡単ステートマシンマクロ</title><pubDate>2006-03-24 02:23:00</pubDate><link>http://lispuser.net/memo/lisp/2006-03-24-02-23.html</link><description><![CDATA[<div class="outline-2" id="outline-container-2">
<h2 id="sec-2"> Common Lisp で簡単ステートマシンマクロ</h2>
<div id="text-2">

<p> 
</p>

<p>
<a href="http://blog.goo.ne.jp/uiweo8864/e/9165357563f587253cc58880e019275b">古くて新しい状態遷移</a>
 に触発されて Lisp でトレイの開閉(:OPEN, :CLOSE) 
と再生状態 (:STOP, :PLAY) を持つ簡単なステートマシーンを定義し
てみます． Lisp 風といってもマルチパラダイムな言語ですから CLOS ？ 再帰？
など Lisper 内でも流派によって千差万別でしょう．今回はステートマシー
ンを表現するクロージャを返す関数を作ります．
</p>

<p>
状態を二つ用意します．それぞれ トレイの開閉を表わす tray, 再生状態を表
す player です．これを make-cd-player の &aux パラメータとして宣言し，
初期状態を設定しておきます．
</p>

<p>
次に，アクション (:open, :close, :play, :stop) に応じた関数 (%open,
%close, %play, %stop) も定義します．それぞれ cond 分で状態をチェックし
て動作し，状態を書きかえてゆきます．
</p>

<pre class="example">
(defun make-cd-player (&amp;aux (tray :CLOSE) (player :STOP))
  (labels ((%open ()
             (cond ((and (eq tray :CLOSE) (eq player :PLAY))
                    (funcall (lambda ()
                               (print &quot;&gt;&gt;&gt; STOP&quot;)
                               (setf player :STOP)
                               (print &quot;&gt;&gt;&gt; OPEN&quot;)
                               (setf tray :OPEN))))
                   ((and (eq tray :CLOSE) (eq player :STOP))
                    (funcall (lambda ()
                               (print &quot;&gt;&gt;&gt; OPEN&quot;)
                               (setf tray :OPEN))))
                   ((and t t)
                    :ignore)))
           (%close ()
             (cond ((and (eq tray :OPEN) t)
                    (funcall (lambda ()
                               (print &quot;&gt;&gt;&gt; CLOSE&quot;)
                               (setf tray :CLOSE))))
                   ((and t t)
                    :ignore)))
           (%play ()
             (cond ((and (eq tray :CLOSE) (eq player :STOP))
                    (funcall (lambda ()
                               (print &quot;&gt;&gt;&gt; PLAY&quot;)
                               (setf player :PLAY))))
                   ((and (eq tray :OPEN) t)
                    (funcall (lambda ()
                               (print &quot;&gt;&gt;&gt; CLOSE&quot;)
                               (setf tray :CLOSE)
                               (print &quot;&gt;&gt;&gt; PLAY&quot;)
                               (setf player :PLAY))))
                   ((and t t)
                    :ignore)))
           (%stop ()
             (cond ((and t (eq player :PLAY))
                    (funcall (lambda ()
                               (print &quot;&gt;&gt;&gt; STOP&quot;)
                               (setf player :STOP))))
                   ((and t t)
                    :ignore))))
    (lambda (input)
      (case input
        (:open  (%open))
        (:close (%close))
        (:play  (%play))
        (:stop  (%stop))))))
</pre>


<p>
(and t t) など t で済むのに何故か非常に冗長に書いてあります．これには意図がありまして，
このプログラムを元に，次のようなステートマシーンを定義するマクロを書こうと思ったためです．
</p>

<pre class="example">
(def-state-machine state-machine-cd-player ((tray :CLOSE) (player :STOP))
  (:open 
   (:CLOSE :PLAY)  -&gt; (lambda ()
                        (print &quot;&gt;&gt;&gt; STOP&quot;)
                        (setf player :STOP)
                        (print &quot;&gt;&gt;&gt; OPEN&quot;)
                        (setf tray :OPEN))
   (:CLOSE :STOP)  -&gt; (lambda ()
                        (print &quot;&gt;&gt;&gt; OPEN&quot;)
                        (setf tray :OPEN))
   (:any :any)     -&gt; :ignore)
  (:close
   (:OPEN :any) -&gt; (lambda ()
                       (print &quot;&gt;&gt;&gt; CLOSE&quot;)
                       (setf tray :CLOSE))
   (:any :any)  -&gt; :ignore)
  (:play
     (:CLOSE :STOP) -&gt; (lambda ()
                         (print &quot;&gt;&gt;&gt; PLAY&quot;)
                         (setf player :PLAY))
     (:OPEN :any) -&gt; (lambda ()
                       (print &quot;&gt;&gt;&gt; CLOSE&quot;)
                       (setf tray :CLOSE)
                       (print &quot;&gt;&gt;&gt; PLAY&quot;)
                       (setf player :PLAY))
     (:any :any) -&gt; :ignore)
  (:stop
   (:any :PLAY) -&gt; (lambda ()
                      (print &quot;&gt;&gt;&gt; STOP&quot;)
                      (setf player :STOP))
   (:any :any)  -&gt; :ignore))
</pre>


<pre class="example">
[使用例]
CL-USER&gt; (setf c (cd-player))
#&lt;CLOSURE (LAMBDA (INPUT)) {982D315}&gt;
CL-USER&gt; (funcall c :open)

&quot;&gt;&gt;&gt; OPEN&quot; 
:OPEN
CL-USER&gt; (funcall c :close)

&quot;&gt;&gt;&gt; CLOSE&quot; 
:CLOSE
CL-USER&gt; (funcall c :play)

&quot;&gt;&gt;&gt; PLAY&quot; 
:PLAY
CL-USER&gt; (funcall c :stop)

&quot;&gt;&gt;&gt; STOP&quot; 
:STOP
CL-USER&gt; (funcall c :open)

&quot;&gt;&gt;&gt; OPEN&quot; 
:OPEN
CL-USER&gt; (funcall c :play)

&quot;&gt;&gt;&gt; CLOSE&quot; 
&quot;&gt;&gt;&gt; PLAY&quot; 
:PLAY
</pre>


<p>
さて，このマクロを展開した結果が最初に示した関数のようになればいいわけ
です．ではさっそく実装してみましょう．
</p>

]]></description></item><item><title> LOOP マクロによる AA 折れ線グラフ</title><pubDate>2006-03-18 18:01:00</pubDate><link>http://lispuser.net/memo/lisp/2006-03-18-18-01.html</link><description><![CDATA[<div class="outline-2" id="outline-container-3">
<h2 id="sec-3"> LOOP マクロによる AA 折れ線グラフ</h2>
<div id="text-3">


<p>
 
</p>

<p>
Common Lisp のループマクロによる AA 降れ線グラフ (<a href="http://oss.timedia.co.jp/index.fcgi/kahua-web/show/column/%BA%A3%C6%FC%A4%CE%B0%EC%B9%D4">Haskell 版</a>
, <a href="http://practical-scheme.net/wiliki/wiliki.cgi?Shiro">Scheme 版</a>
 (2006/03/14 21:31:12 PST))
</p>

<pre class="example">
CL-USER&gt; (plot &quot;RCRFCRFFCCRFFRRCRRCCFRFRFF&quot;)
                  __
                 /  \/\/\
 _/\_/\        _/        \
/      \__/\  /
            \/
NIL
CL-USER&gt; 
</pre>



]]></description></item></channel></rss>