--Multipart_Mon_Nov__8_20:50:08_1999-1
Content-Type: text/plain; charset=ISO-2022-JP

ごとけんです

パラメーター付きのクラスを支援するMix-inモジュールParametric
とParametricのサブクラス生成のためのインターフェイスを含む 
paramclass.rb を送ります。

以下が全機使った例。いろいろカッコ悪いので改良は歓迎。

  class Foo
    include Parametric

    def default_parameters      # デフォルトパラメータの配列
      ["foo", 10]
    end
  end

  include ClassParameterizer

  Parametric Foo       # Parametric宣言: 以下でFoo()が使える

  Foo.parameters                 #["foo", 10]
  Foo(10, "foo", 20).parameters  #[10, "foo", 20]
  Foo(10, "foo", 20).rootclass   #Foo

  foo  oo(10).new
  foo.parameters                 #[10]

-- gotoken

--Multipart_Mon_Nov__8_20:50:08_1999-1 Content-Type: application/octet-stream Content-Disposition: attachment; filename="paramclass.rb" Content-Transfer-Encoding: 7bit in ix-in module Parametric DESCRIPTION Parametric is the mix-in module for the parametric class. The including class must provide a class method default_parameters. The method default_parameters must returns the default parameters as an array and this method is used for the subclass generarion by ClassParameterizer::Parametric. CLASS METHOD : parameters Returns parameters as an array. For a Parametric class Foo, the value of Foo(10).parameters is [10] : rootclass Returns the root class. For a Parametric class Foo, the value of Foo(10).rootclass is Foo. METHOD : parameters Returns parameters as an array. Same as parameters class method. EXAMPLE class Foo include Parametric def default_parameters ["foo", 10] end end include ClassParameterizer Parametric Foo Foo(10, "foo", 20).parameters #[10, "foo", 20] Foo(10, "foo", 20).rootclass #[10, "foo", 20] foo oo(10).new foo.parameters #[10] odule ClassParameterizer DESCRIPTION ClassParameterizer is the utility module for Parametric class. MODULE METHOD : Parametric class1, class2, ... Works as a declaration. For each class of options, Parametric defines the same name fuction, which takes options as parameters and returns a class. VERSION 19991108 AUTHOR Gotoken <gotoken / notwork.org> 濺 module ClassParameterizer ClassParameters } RootClasses } def Parametric(*klasses) klasses.each do |klass| klass < Parametric or raise TypeError, "non Parametric class `#{klass}' " next if RootClasses.include?(klass) cn lass.name eval "def #{cn}(*args); #{cn}.instance_eval{class_generator(*args)} end" ClassParameterizer::ClassParameters[klass] lass.default_parameters end end module_function :Parametric end module Parametric def Parametric.append_features(mod) super mod mod.const_set("CLASSLIST", {nil,mod}) def mod.class_generator(*args) klass elf::CLASSLIST[args] || self::CLASSLIST[args] lass.new(self) ClassParameters[klass] rgs RootClasses[klass] elf klass end def mod.parameters ClassParameterizer::ClassParameters[self] end def mod.rootclass ClassParameterizer::RootClasses[self] end end def parameters self.type.parameters end end ########## devel test ########## if __FILE__ $0 def xmp(arg) # prints expample code and result line by line __res__ ] eval arg.gsub(/^(.*)\n?/){"__res__ << (#{$1}).inspect;"} arg.split(/\n/).each_with_index{|l,i| (puts "\n" ; next) if l /^$/ print "#{l}\n #{__res__[i]}\n" } end class C include Parametric def C.default_parameters [100] end end include ClassParameterizer xmp <<EOS Parametric C C.parameters C(10).id C(10).id C(20,10) < C C(10).parameters C(10).rootclass C(10).new D (0) Parametric C D.id C(0).id EOS end --Multipart_Mon_Nov__8_20:50:08_1999-1--