2008年2月5日火曜日

3 Developing a Simple CLOS Program: Locks


  • 3.1 OVERVIEW OF LOCKING

    • 用語と概念の整理。
    • locks, seize, release, busy, free, owner。
    • Simple lock, Null lock。

  • 3.2 DEFINING THE KINDS OF OBJECTS-CLASSES

    • クラスの設計。lock, simple-lock, null-lock。
    • 用語の整理。built on, is a drect superclass of, is a direct subclass of, basic class
    • basic classを導入するメリット。

      • (typep obj 'lock)で、チェックできる。
      • 名前付け、を統一特性として全てのロックに付与することができる。
      • デフォルトの振舞を定義できる。

    • lockクラス、simple-lockクラス、null-lockクラスを定義。
    • :documentation
    • :reader, :writer, :accessor。
    • :writerとsetf。

  • 3.3 CREATING NEW OBJECTS-INSTANCES

    • make-instance。
    • constructor functions.
    • constructor functionsを作ることを推奨。
    • type-of, typep, subtypep。

  • 3.4 DEFINING THE INTERFACE-GENERIC FUNCTIONS

    • lambda-lists, congruent。
    • 総称関数はクラス名を含めた方がよい。reset、ではなくreset-lock。genericすぎると名前が衝突。
    • generic functionsはa protocolを成す。
    • protocolは、振舞からlockのsemanticsを規定している。
    • protocolは、考え方であり、CLOSのメカニズムではない。

  • 3.5 DEFINING THE IMPLEMENTATION-METHODS

    • argument と parameterは違う。
    • specialized parameters。
    • applicable methods。
    • "Rule of method applicability"
    • without-process-preemption, process-wait, *current-process* の定義。
      allegroでは、次のよう?

      (defun without-process-preemption (&body body)
      (funcall #'without-interrupts body))

    • set-ifマクロを定義。
    • methodsを定義。

  • 3.6 SPECIALIZING THE BEHAVIOR OF LOCKS

    • print-object。print,prin1,printc,write,formatなどなど、print-objectを使っている。
    • allegroでは、(system:memref l 0 0 :unsigned-natural) ?
    • print-objectはエラーを吐くべきではない。
    • basic classes - default methods。
    • 既存の総称関数のメソッドで済ませられるときは、そうすべき。

  • 3.7 ANALYZING THE INHERITANCE OF LOCKS

    • "Rule 1 of class precedence: A class always has precedence over its superclasses."
    • generic dispatch。

  • 3.8 EXTENDING THE LOCKING PROGRAM

    • mixin class, aggregate classes。
    • deadlock。
    • ordered lock。
    • ordered-lock-mixinを定義。
    • :type
    • ordered-lockとordered-null-lockを定義。
    • mixin classはbefore-methodやafter-methodで振舞を記述することが多い。
    • aggregate classにメソッドを定義することは極力さける。それがプログラムのモジュラー性を維持する。
    • "Rule 2 of class precedence: Each class definition sets the precedence order of its direct superclass."
    • after-method: most-specific-last。
    • ordered lockの振舞を実装。
    • process自体がclassになっていて、どのlockを所有しているかを持てる形もあるが、ここではそれはa hash tableで管理する。
    • ordered locksのメソッドは、beforeで定義する。このbeforeはhigher lockを所有しているかのチェックをしてもってればsignalを上げるという形にする。すると既存のprimary methodそのままでordered lockがいける。
    • 同様に、seizeとreleaseにafterでメソッドを足すことにより、ordered-lock-mixinに対する追加的な振舞(処理)を記述する。

  • 3.9 HOW CLIENT PROGRAMS USE LOCKS

    • 今さらだが、describeは普通の関数(non generic)なので、describe-objectにメソッドをつくる。

  • 3.10 REVIEWING THE LOCK CLASSES

    • OOプログラムを説明する際のポイント。

      • クラスの一覧。
      • それぞれのクラスが提供するslotsとmethods。
      • class precedence list。

    • ここの"contribute"の使い方は違和感あり。こういうものなのかな。

  • 3.11 THE EXTERNAL AND INTERNAL PERSPECTIVES

    • externalとinternalでメソッドなどを分類。

  • 3.12 GUIDELINES ON DESIGNING PROTOCOLS

    • ガイドラインの5項目を紹介。

2008年2月2日土曜日

2 Elements of CLOS Programs


  • 前説

    • CLOSの構成要素は、classes、instances、generic functions と methodsであり、これらが密接に関係している。

  • 2.1 CLASSES AND INSTANCES

    • CLOSプログラミングはclassの定義からはじまる。
    • a class は a COMMON LISP typeである。そのclassのオブジェクトをinstanceという。
    • CLOSのinstanceのアイデンティティの考え方は、そもそものLisp objectsのそれと合致している。

  • 2.2 SLOTS

    • classの構造はslotsで表現される。slotsはaccessorでread/writeされる。
    • slotsには、local slots と shared slots がある。

  • 2.3 SUPERCLASS

    • classからclassを作る。元のclass(component class)をsuperclassという。できたclassは、structureとbehaiviorを継承する。
    • superclassの対義語はsubclass。
    • superclass、subclassの関係は数珠繋ぎにできる。直近のsuperclassをdirect superclassという。

  • 2.4 GENERIC FUNCTIONS

    • instanceを操作するときは、generic functionsを用いる。
    • generic functionsは、利用者からみると、通常のCL関数と同じようである。
    • generic functionsがインターフェイスを定め、実装はmethodsでやる。この点が通常のCL関数と異なる。
    • どのmedthodを呼ぶかを判断する機構は、generic dispatchと呼ばれる。

  • 2.5 METHODS

    • 前章とおなじ。

  • 2.6 METHOD ROLES

    • メソッドにはrolesがある。
    • メソッドには、primary methodsとauxilaly methodsがある。
    • auxilaly methodsには、before-methodsとafter-methodsとaround methodsがある。
    • primary methodsが主たる機能を担う。
    • auxilaly medhodsは副作用を担うことが多い。
    • methodsは継承される。
    • 継承と、primary,auxilalyの兼ね合いとが、methods間の作業分担を形成する。

  • 2.7 THE CONTROLLER OF INHERITANCE

    • 2つのsuper classes が競合する特徴をもっていた場合、inheritanceはどうなるか?
    • a class precedence list に従って、precedenceが決まり、それがinheritanceを決める。
    • a class precedence list は、class定義のあり様によってきまる。
    • more specific なら more prior。

  • 2.8 SUMMARY OF THE CLOS MODEL

    • 特になし。

  • 2.9 HOW CLOS EXTENDS COMMON LISP

    • defstructとCLOSの比較。
    • 良好な接続。classesはtypesと同じように扱える。
    • CLOSの方が柔軟。