(CLOS:シーロス、クロス)と言います。いう形式になっていますが、これは他のオブジェクト指向言語から見たらへんてこな順序で、わかりにくいかもしれません。args...)と書きたいでしょう。解決方法はいくつかあるかと思います。Protocol(MOP)という、デファクトスタンダード的なメタプログラミングの方法が用意されています。MOPを利用してみました。MOPには処理系毎の差異を吸収するラッパーライブラリも存在しますが、面倒くさいので処理系依存のコードを書いてしまいます。set-funcallable-instance-functionでセットした関数を、普通の関数と同じように呼び出すことができます。args...)という形式でメソッド呼び出しが出きるようになります。CommonLisp2010年9月23日木曜日EmacsからGhostScriptを利用するmake-comintを使ってみたかったので。grestore)S式からPostScriptへの変換は、単純に順序を入れ替えているだけなのでたいした意味が無いような気がしますが、括弧にかこわれているほうが精神が落ち着きますね。PostScript2010年9月17日金曜日ELispでobjdumpを呼んでバイト列を逆アセンブルするLinuxなどでプログラムを逆アセンブルする際には、objdumpを使うと便利です、たぶん。Emacsからobjdumpを呼んでバイト列を逆アセンブルするようなELispを書いてみました。バイト列といってもリストしか対応していませんが。ELisp超リードマクロに対抗してchar-codeの限界までリードマクロCLerはもっと他人のネタに反応すべきらしいので対抗してみた。組み込みのリーダを書き換えるのは敷居が高いので、ごく普通の方法にしました。私はSBCLで動かしましたが、CL処理系なら大抵は動くのではないでしょうか。仕様に乗っ取ったやり方のはずなのにアレゲな気配がぷんぷんする・・・。CommonLisp2010年9月13日月曜日list処理マクロmap系関数のような処理をするマクロを作ってみました。いつもどおり毒にも薬にもならない感じです。いった形で利用します。出現順にキーワードごとに決まった処理を行い、リストを操作します。Lisp)Clojureのswap!はアトムの古い値を引数にして関数を呼び出し、その結果を新しい値とします。Lispで計4パターン書いてみました。新しい値が返るfnとfn-rの違いは、古い値が関数の引数として渡される際、第1引数となるか最後の引数となるかです。1と2の違いは、返り値として古い値を返すか新しい値を返すかです。どのパターンが有用なのかは、使ってみないことには判断できないような気がします。その2C風switchをgoを使わない形に書き直して見ました。caseの実行する式の部分に、後続で処理するすべての式をぶち込んでいます。今回は明示的にブロックを抜けない限り、最後に評価された値が返ります。4)))loopマクロの箇所は、最初はmapcanで書いていたのですが、なぜか処理が止まったので書き換えました。mapcanが破壊的関数なため、maplistで段階的にアクセスしているリストの構造(clausesの一部)を変更してしまっているのだろうと思っています。mapcanの非破壊版くらい仕様に入れておいて欲しかったです。風のswitchTwitterを眺めていたらネタに出会ったので書いてみました。Lispのcaseと同様の式を書くことができます。caseと異なるのは、条件に一致した場合goで目的の処理の前に飛ぶところです。break)としない限り、一致した箇所以降の式をすべて実行します。caseと異なり、tagbodyに展開するため返り値は常にnilになります。その2昨日の続きのforマクロ。昨日のままだと、外側のletのbinding内でそんなシンボル無いです、と怒られて動かないことがあると思われるので修正.せっかくなのでgithubを活用する事にしました。http://github.com/kurohuku/for-loop現状の動作はこんな感じです。Lispにはやたらと高機能なかわりに構文がおかしなloopマクロが存在します。キーワードを使ってネストさせる必要があります(多分)。Clojureのforは多重ループ(のようなもの)を簡潔に記述できるので、似たような構文をマクロで定義してみようと思います。toに展開されるものだけです。手抜きパターンマッチのせいで:inや:rangeはキーワードでなければなりません。展開後の一番外側のletのせいで警告が出てきますし、まだまだ改良が必要なようです。C++風出力githubを試しに使ってみるテスト。streamsを使ってみました。{DDF79C9}>stream-write-stringの引数がstream-manipulatorクラスのオブジェクトの場合、manip-streamを引数としてactionスロットの関数が呼び出され、manip-streamの状態を変化させます。format関数は高機能なかわりにやたらと複雑なので、こういった書き方のほうが多少はわかりやすくなるかもしれません。