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-18

11/22 第24回 慢性的CL勉強会@Lingr8時だョ!全員集合告知

| 11:50 | 11/22 第24回 慢性的CL勉強会@Lingr8時だョ!全員集合告知 - わだばLisperになる を含むブックマーク はてなブックマーク - 11/22 第24回 慢性的CL勉強会@Lingr8時だョ!全員集合告知 - わだばLisperになる

今回は、趣向をちょっと変えてライブラリを読んで内容について議論してみたいと思います。

読んだ上での議論になるので今回は、事前準備必須でよろしくお願います!

といっても準備の程度は個々人で自由です。ざっと眺めおいてもらうだけでもOKです。

今回読むライブラリですが、今回は、Gary KingさんのMetatilitiesにしたいと思います。

http://common-lisp.net/project/metatilities/

今回が良い感じならば、Arnesiや、KMRCL等も俎上にのせてみたいなと考えています。

場所:Lingr: Common Lisp部屋
日時11/22 (土) 20:00から適当(途中参加/離脱/ROM歓迎)
勉強会の目標CLに関して一つ位賢くなった気になること
時刻お題対象者参考リンク
20:00-21:00位までMetatilitiesを読むCLで色々書く(書きたい)方Metatilities

勉強会のネタがあれば、このブログにコメント頂くか、Lingr等に書き置きしてみて下さい。好きなテーマを持ち込んでみて頂くというのも大歓迎です!

CommonORBITでデザインパターン - Template Method

| 08:06 | CommonORBITでデザインパターン - Template Method - わだばLisperになる を含むブックマーク はてなブックマーク - CommonORBITでデザインパターン - Template Method - わだばLisperになる

MOPの良い資料や教材がないかネットを漁っているのですが、CMUのLISPリポジトリにはお宝が埋れていることが多く、AMOPの5、6章のPostScriptファイルが埋まっていたりするのですが、今日は、それ以外にも面白いものをみつけたので遊んでみることにしました。

CLといえば、やはりCLOSなのですが、CLOSに至るまでに、Flavors、CommonLoops、CommonObjects、ObjectLisp、等々、色々な団体やメーカーが各々のシステムをつくっていました。

それぞれ、背景となる思想が違ったりして面白いのですが、自分がMOPを学ぶモチベーションとして、これらを今の処理系で動かして遊ぶというのがあります。

それはさておき、お題のCommonORBITなのですが、こちらはちょっと毛色が変ったものらしく、20年位前に作成されていたプロトタイプベースのシステムのようです。

このページでは、教材用のBOOPSとCommonORBIT(CORBIT)があるのですが、どちらも簡単に動かして遊ぶことができました。(BOOPSは、ファイルをコンパイルするのに補助関数をeval-whenでコンパイル時に評価するようにする必要あり)

とりあえず、オジェクト指向プログラミングの練習だとどうも馬鹿のひとつおぼえでTemplate-Methodばっかりやってしまうのですが、CORBITでもやってみました。

簡単に内容を説明すると、

template

templateがテンプレートで、op1とop2、templateというメソッドを持っていて、プロトタイプでは、op1とop2を組み合わせた雛型がtemplateです。

defobjectでの定義では関数を一緒に定義する必要はなく、defaspectで後で付けても良いのですが、templateでは、一緒に定義してみています。

concrate-1

templateを雛型にしたconcrate-1を作成し、op1と、op2のを作成します。

これで、(template 'concrate-1 "foo bar baz")のとすると、"**FOO BAR BAZ**"が返ってきます。

concrate-2

CORBITでは、CLOSにはないような機能が割と沢山あるのですが、:delegateを指定することによって、委譲もできます。

ということで、op1は、concrate-1に委譲していて、op2は、新しく定義、templateは、継承してくる、という感じになっています。

プロトタイプベースのものや、委譲などは自分は全然知らない世界だったのですが、面白い機能だと思いました。

ちなみにCLOSの上に構築されたものではないので競合はせず、同時に混ぜて使うことも可能です。

;; テンプレ
(defobject template
  (op1 :function (self str) "")
  (op2 :function (self str) "")
  (template 
   :function (self str) (op2 self (op1 self str))))

;; concrate-1作成
(defobject concrate-1 template)

(defaspect op1 'concrate-1
  :function (self str) (string-upcase str))

(defaspect op2 'concrate-1
  :function (self str) (format nil "**~A**" str))

;; concrate-2作成
(defobject concrate-2 template
  (op1 :delegate 'concrate-1)
  (op2 :function (self str) (format nil "//~A//" str)))

(template 'concrate-1 "foo bar baz")
;=> "**FOO BAR BAZ**"

(template 'concrate-2 "foo bar baz")
;=> "//FOO BAR BAZ//"

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