2010プログラマ未満2010年8月28日土曜日ClojureでJWindowを作るふせんちっくなウィンドウを作ってみます。無駄にクリック時の動作をかえられるようにしたりしてみました。Lispのマクロで書いてみるすでにいろいろなところで書かれているネタな気はしますが、書いてみました。->>はexpを次の式の最後の引数の位置に挿入します。Lisp)のバイナリファイルのパースっぽいものを書こうとしてみました。Lisp初めにLispの括弧ネタ(注1)に触発されて思い浮かんだネタを書いていきます。http://e-arrows.sakura.ne.jp/2010/08/is-lisp-really-has-too-many-parenthesis.html符号的プログラミングについてPerlは非常にリッチな言語です。世界はPerlでかかれているらしいです。このPerl言語のエキスパートたちが、Perlの持つリッチな機能をフル活用するプログラミングスタイルを符号的プログラミングと呼びます。Lispも非常にリッチな言語なため、符号的プログラミングを行うことができます。Lispプログラムをいかにして符号的なスタイルに変換していくかを見ていきましょう。Lispプログラム元ネタに合わせて、階乗の値を順番に表示していくプログラムを書いてみます。20)関数fact-1の内部で、関数innerを定義し、再帰呼び出しを行っています。この関数を徐々に符号的に改良していきます。名前は付けない、使わないfact-1を眺めて、まず気づく問題点は内部関数に名前を付けている点です。Lispには無名関数を作るlambdaマクロ(注2)があるので、これを利用しましょう。関数呼び出しの位置にlambdaフォームがくると特別扱いされるので、他のシンボルより特殊な存在だと思います。1))関数に名前を付けることは避けられましたが、今度はまったく同じ式を2回も記述しなければならないという問題が発生しました。関数(サブルーチン)にも言えますが、同じものはまとめてしまうのが普通でしょう。このlambdaフォームをまとめるために名前を付けてしまっては本末転倒です。そこで、共有構造を利用することにしましょう。1))これで見やすくなりました。defunもlambdaに直してみましょう。1)))setはマクロではなく関数です。第1引数のシンボルに、第2引数引数の値をセットします。setは関数スロットではなく普通の値を格納するスロットに第2引数をセットするため、関数呼び出しにはfuncallが必要となります。20)さて、本題に戻ります。内部関数の名前は消え去りましたが、この関数にはまだまだ名前がたくさん残っています。関数名から消していきましょう。関数は単純に他のシンボルにセットすればいいだけなので簡単です。20)次は変数名を消していきましょう。Lispのシンボルには値をセットするスロットが複数あるので、関数と通常の変数で同じシンボルを別々の意味で利用できます。1)))whenはマクロなので、setfで設定できません(多分)なので、他のマクロでラップしてしまいましょう。1)))lambdaと括弧を符号的にするlambdaも同じように対処できるかと思いきや、「注2」に書いたように、関数呼び出し位置に現れるlambdaフォームは特別扱いされるため、うまくいきません。3)この問題を解決するためには、自分の定義したシンボルが読み込みんむタイミングでlambdaに変化してくれれば良さそうです。Lispでは、実行時、コンパイル時(≒マクロ)の他に、読み込み時の動作を定義するリーダマクロが存在します。リーダマクロを利用すれば、問題を解決できるに違いありません。1)))ここまで書くとふと思います。この括弧の群れは符号的ではないのではないか、と。消し去ってやりましょう。$ここまでくれば後一歩です。最後に残った関数名、fact-nを取り去り、直接引数を与えて呼び出してみましょう。$終わりに最初と最後のプログラムを比べると、もはや別のプログラミング言語ではないかと思えてしまいます。Lispプログラムなのです。符号的プログラミングは、一般的なプログラミングスタイルとはかけ離れているように見え、一部のエキスパートにしか駆使することの出来ない黒魔術かのような錯覚を覚えますが、一つ一つの要素を抜き出して考えれば、私たちが日頃書いているごく普通のプログラムとかわりはありません。Perlは非常に高機能ですが敷居が高いのが難点です。Lispは一般的なスタイルのプログラムも非常に書きやすいので、符号的プログラミング入門者にもおすすめです。Lispで遊んでみてください。Lisp関数を作ってみた。M-dなどをうまく駆使すれば連打の必要はなかったのかもしれないけれど。実は組み込みで求めている機能がある、なんてことはないと信じたい。start-point))))現状、正規表現にマッチした部分は切り取らないようにしている。2010/08/15)青春18切符で京都と長野に行ってきました。近くの急な階段を昇ったところ。日本酒の古酒にときめいた。冷やし飴を始めて飲んだが、ショウガの風味があるやつで結構おいしかった。本日の酒(2010/08/04)本日の酒は、はるばるドイツからやってきたビール、ヴァルシュタイナー。輸入してるのはアイコン・ユーロパブ株式会社というとこらしい。酒2010年8月3日火曜日McCLIMで升目を描くformatting-tableを利用すれば良さそうだけど、無理やりな感じが現れてる。LispworksのCLIMのページを参考にした。