In article <1014126659.698034.15364.nullmailer / ev.netlab.jp>,
  matz / ruby-lang.org (Yukihiro Matsumoto) writes:

> 厳密にはそうでしょうね。まあ、全体を作り直すのはちょっと手間
> なので(その労力はRiteに回したい)、1.7/1.8では適当にお茶を濁
> そうと思ってます。

どうも私の知識は古かったようで、どうやら必ずしもすべての direct super
class/module のリストを保存する必要がないやりかたもあるようです。

  A Monotonic Superclass Linearization for Dylan
  http://www.webcom.com/~haahr/dylan/linearization-oopsla96.html

の C3 Linearization というのがそうですが、これは(著者の主張によれば)
CLOS などよりも良い性質を持つようです。

アルゴリズムはかなり単純で、direct super class の class precedence
list (いうまでもありませんが Ruby の ancestors) を merge することによっ
て実現可能なようです。

ただ、incremental な更新に適用できるかどうかはちょっと考えてみないとわ
かりません。でも、なんとなく可能な気がします。もし可能だとしたら、たぶ
ん、次のようなかんじで実現できるような気がします。たぶん。

class Module
  def include(*ms)
    l = [self.ancestors[1..-1], *ms.map {|m| m.ancestors}]
    l.reverse! # Ruby prefer later module.
    r = [self]
    until l.all? {|a| a.empty?}
      a2 = l.find(lambda {consistent でない。適当にどうにかする。}) {|a|
        !l.any? {|a1| a[1..-1].include? a.first}
      }
      r << a2.shift
    end
    self.ancestors = r
  end
end

あと、include に複数のモジュールを渡したときは逆順にして欲しい気がしま
す。後の方が優先順位が高いという点では include を何回も呼び出した場合
と一貫してるんですが、CLOS とかと逆なので...

> 検出しようとしているサイクルは [A, C, A] のようなものですか
> ら、現時点でのトポロジカルな構造はサイクルになっていても、時
> 間順の結果としての個々のモジュールの ancestors がサイクルで
> ないんで検出しなくても良いかなあと思うんですが。

ふむ。どうなんでしょうねぇ。
-- 
[田中 哲][たなか あきら][Tanaka Akira]
「ふえろ! わかめちゃん作戦です$(C⊇」(Little Worker, 桂遊生丸)