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