sequential-command.elなどのように、多少空気を読んで動作を変えるようなコマンドを定義します。ポイントが行末にある場合、次の行に移動する。バッファの終端でもある場合、改行する。'my-ctrl-e)my-ctrl-aコマンドはC-aに割り当てるつもりで定義したものです。1つ前に実行されたコマンドもmy-ctrl-aの場合には、M-v(scroll-down)の動作を行います。my-ctrl-eコマンドはmy-ctrl-aのC-eバージョンです。1つ前のコマンドがmy-ctrl-eの場合にはC-v(scroll-up)の動作を行います。これでscroll-downが押しやすくなった上、C-vを他のコマンドに割り当てる余裕ができました。普段はC-oをhippie-expandコマンドにしているので、展開が必要なさそうな箇所では別の動作をするmy-ctrl-oも定義しました。こちらはC-a/C-eに比べて残念な感じがします。Gladecl-gtk2はgladeで作成したファイルを利用できるようなので遊んで見ました。ありそうな文字コードを総当たりで試す。id="liststore1"/></interface>利用しているライブラリはすべてquicklispでインストールできます。ライブラリのおおまかな内容は以下のとおり。正規表現リテラルに利用。sb-ext:octets-to-stringを利用しているのでSBCLでのみ動作します。他の処理系で動作ささせる場合、バイト列を文字列に変換する箇所を変更する必要があります。評価するとテキストボックス(entry)を持ったウィンドウが表示されます。このテキストボックスにURLを入力して隣のボタンをクリックすると、URLの内容(HTML)を取得し、他のURLへを参照していそうなa/link/img/scriptタグを抜き出してtree-viewに表示します。わかりづらかった点として、gtk:array-list-storeがCommonLisp側で定義されたクラスだということがありました。Gladeでモデルに指定できない(ような気がします)。primefu*kネタ言語を実装しました。*primes*))名前のとおり、中身はBrainfu*kです。入力となるソースコードは数値で、素因数分解によって命令列が作成されます。world!"と出力するプログラムは以下の値です。考える時代は継続らしいので、cl-contを利用してこんな感じで書いてみます。defclassとdefmethodを定義してみました。似たようなネタばかりやっている気がします。Lispは自由過ぎてわかりづらいという思いブログがソースコード貼り付け場所と化しているので、文章を書く努力。推測とか感覚とかなんとなくがミックスされてるので文章としてどうなんだろう。Lispは数多くあるプログラミング言語の中でも、自由度という点では(大量の括弧を気にしなければ)トップクラスの言語ではないかと思います。Lispには、プログラマが手を加えることのできる処理のタイミングが3つあります。1つ目は普通に処理が実行される時、2つ目はコンパイル時(マクロ(※1)/コンパイラマクロ)、3つ目は読み込み時です。多くの言語では、2つ目と3つ目の処理に手を加える機能は存在しないか、限定的なものです。Lispでは、プログラマが望むならば、大抵のものは自分で作成できます。組み込みのオブジェクトシステム(CLOS)が気にくわなければ、新しいオブジェクトシステムを作成して組み込めます。数値演算を中置記法で書く構文を導入することもできますし、正規表現リテラルの記法を定義することもできます。自由であることは良いことだと、多くの人が思っているでしょう。Lispがこれだけ自由なのは果たして良いことなのでしょうか。良いことですが、世の中にはリスク無しのリターンも、欠点のない利点もほとんど存在しないだろうと思います。このフリーダムっぷりにも相応の欠点がある、と感じています。なにが問題かというと、それは「わかりにくい」ということです。Lispのライブラリですが、それでもLispハッカーな方々がいろいろなライブラリを作成し、公開してくれています。したライブラリを使おうとすると、私のような木っ端Lisp使いは思うわけです。「使い方がわからん」と。いうのも、ライブラリごとにインタフェースがまちまち(※2)で、「他のライブラリではこうだったし、たぶんこうだろうな」という考えが通用しにくいからです。ドキュメントや、最悪ソースコードをしっかり読めば理解はできるでしょう。JavaだったらAPI仕様を斜め読みする程度で使い方はわかります。どの機能(クラス)もだいたい同じような使い方だからです。Lispほどわかりづらいことはないだろうと思います。Lispほど自由ではないです。これらの言語を設計した人たちは、プログラマの自由を制限して、思想や作法を強制しています。そのおかげでわかりやすいです。Lispよりもたくさんのユーザーと開発者がいます。制限された自由の中で、同じような作法で作られたライブラリ群を使う方が良い、と考える人が大勢いるということだと思います。いった考えを貰ってきても良いはずです。Lispが消え去るわけではありませんし。今後しばらく、短い・わかりやすい・再利用しやすい、けれどそのかわりに思想や作法を強制される、という考えでも良いということを念頭にプログラミングしてみようと思います。自作マクロの山になって本末転倒な予感がしますが。仕様上、マクロがコンパイル時に展開される、という表現は正しくないかと思います。詳しくはHyperSpecあたりを参照してください。Lispのライブラリのインタフェースがまちまちだ、というのは個人的な印象に過ぎないかもしれません。ネタ2011年6月4日土曜日リクエストパラメータを引数として扱うHTTPの説明の際に、URLを関数、リクエストパラメータを引数と例えることがあるようなので、実際に引数=リクエストパラメータとなるようにしてみました。区別せずに値を取得できる関数を定義する。*app*)Webページとして表示させるために、Clackを利用しました。Hunchentoot、Clack、cl-annot、Alexandriaをインストール(すべてquicklispでインストール可能)後、上記のコードを実行すると、5555ポートでWebサーバが立ち上がります。Webページとして表示されます。アクセスすると、前回とは異なる内容が表示されるかと思います。httpfn/clackをアノテーションとして付加すると、引数名と同名のリクエストパラメータの値を受け取るClack用の関数に変化します。同等の処理を毎回記述するよりも、アノテーションを付加するだけのほうが楽で良いかなぁ、と思いました。Webアプリケーション開発の経験値がないので、有用であるかはわかりませんが。