Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-11-24

MOP-IN-ONE-DAY-2008回想 (4)

| 17:00 | MOP-IN-ONE-DAY-2008回想 (4) - わだばLisperになる を含むブックマーク はてなブックマーク - MOP-IN-ONE-DAY-2008回想 (4) - わだばLisperになる

A. CLのコードを書く上でお手本となるようなコードはどこで入手できますか

Q. AMOPのClosetteのコードにしろ、PAIPのコードにしろインターネットで公開されているので手本にできるコードは多く入手も簡単。

また、黒田さん個人としては、CLtL2で例となっているコードをお手本にしているとのこと。

上述のコードURL

2008-11-20

MOP-IN-ONE-DAY-2008回想 (3)

| 20:06 | MOP-IN-ONE-DAY-2008回想 (3) - わだばLisperになる を含むブックマーク はてなブックマーク - MOP-IN-ONE-DAY-2008回想 (3) - わだばLisperになる

黒田さんの原稿(おそらく進行用)が括弧で囲まれていてS式風でした。

(1. 総称関数)
(2. ...)
(3. ...)

Emacsだとすいすい移動できていて便利そうでした。

2008-11-19

MOP-IN-ONE-DAY-2008回想 (2)

| 09:30 | MOP-IN-ONE-DAY-2008回想 (2) - わだばLisperになる を含むブックマーク はてなブックマーク - MOP-IN-ONE-DAY-2008回想 (2) - わだばLisperになる

Q. メソッドは、関数より重くないですか?

A. 殆どの場合、メソッドで大丈夫。

メソッドの利用が速度的なネックになることは経験上あまりない。

defmethodと、クラスの組み合わせをdefstructと、関数に書き換えたことも全くなかった訳ではないが、非常に稀。

ただし、商用のCLの処理系は、色々と最適化にノウハウが蓄積されていて、メソッドと関数では速度的に大差ないが、フリーの処理系の場合、PCL(Portable CommonLoops)がベースになっていることが多く、PCLは効率の良い実装はされていないので遅くなっている傾向がある。

ACL(Allegro Common Lisp)では非常に効率良く実装されていて、ストリーム、スレッド等もCLOSで組まれている。

この辺のCLOSのパフォーマンスについては、商用メーカーの自社技術になっているので、具体的にどういうことが行なわれているのか、外部からは分からないことが多い。

また、パフォーマンスについては、no titleでも解説されている。

ちなみに、スタイルの問題として、

(defmethod my-append ((x null) y)
  y)

(defmethod my-append ((x cons) y)
  (cons (car x) (my-append (cdr x) y)))

こういうのは、IFを使わず書けて綺麗ではあるが、さすがに書かず、関数で書く。

ちなみに…

個人的には、SBCLを利用しているだけにショックでした(笑)

CLを大規模に利用していることで有名なITA Software社は、現在SBCLとClozure CLを基幹に利用していて、かつCLOSを駆使したプログラムとのことなので、SBCLとかでも頑張れるんじゃないかと思ったりするのですが、具体的にベンチを取って比較してみないとなんとも言えないですね(^^;

ともあれCLOS的なスタイルで書いて、パフォーマンスが出なかったら、商用の処理系も検討できるというのもCLらしくて良いかなとも思います。

また、Object-Oriented Programming: The Clos Perspectiveは日本のAmazonでみると無闇に高いのですが、海外から買うと、$40位で買えるようです。

2008-11-18

MOP-IN-ONE-DAY-2008回想 (1)

| 03:10 | MOP-IN-ONE-DAY-2008回想 (1) - わだばLisperになる を含むブックマーク はてなブックマーク - MOP-IN-ONE-DAY-2008回想 (1) - わだばLisperになる

先週開催されたMOP-IN-ONE-DAY-2008ですが、纏めようにもMOPの部分は自分も全然理解できてないので、もうちょっとAMOP本を読んで理解してからでないと纏められそうにもありません(^^;

ただ、それだと面白くないので、間に挟まれた小話的な黒田さんと受講者との質疑応答を思い出したところから書いて行くことにしてみました。

Q. defclassでスロットの定義が面倒臭くないですか。簡単に書けるマクロを使ったりしないのですか。

質問を解説すると、CLOSのクラスの定義は

(defclass foo ()
  ((foo :initarg :foo :initform () :accessor foo)
   (bar :initarg :bar :initform () :accessor bar)
   (baz :initarg :baz :initform () :accessor baz)
   (zot :initarg :zot :initform () :accessor zot)))

みたいになることが多く、実際に面倒臭いなと自分も感じます。

A. defclassをそのまま手書する人もいるし、マクロを使っている人もいる。

黒田さんは、手書派。Emacsの補完があるのでそんなに面倒ではない、とのことでした。

また略語作るための道具としてのマクロには否定的だそうです。

ちなみに…

ここからは黒田さんの回答とは無関係なのですが、defclassの記述が面倒というのは割と昔からあるようで、Flavaorsのdefflavor風に書けたり、defstruct風に書けたり色々です。

一例として、Metatilitiesのdefclass*を紹介してみます。

(defclass* foo ()
  (x y z)
  :automatic-accessors
  :automatic-initargs
  (:name-prefix))

;=> 
(defclass foo ()
  ((x :initarg :x :accessor foo-x)
   (y :initarg :y :accessor foo-y)
   (z :initarg :z :accessor foo-z)))

(foo-x (make-instance 'foo :x 33))
;=> 33