[#18233] [book] blade.nagaokaut.ac.jp/ruby/ruby-list/ — Shin-ichiro Hara <sinara@...>

原です。

21 messages 1999/11/01
[#18239] [book] csv_split2 [Re: blade.nagaokaut.ac.jp/ruby/ruby-list/] — keiju@... (石塚圭樹) 1999/11/01

けいじゅ@日本ラショナルソフトウェアです.

[#18244] Re: [book] csv_split2 [Re: blade.nagaokaut.ac.jp/ruby/ruby-list/] — Shin-ichiro Hara <sinara@...> 1999/11/01

原です。

[#18289] Re: [book] csv_split2 — Koretsugu Daigoro <tmmcross@...> 1999/11/02

これつぐです。

[#18291] Re: [book] csv_split2 — keiju@... (石塚圭樹) 1999/11/02

けいじゅ@日本ラショナルソフトウェアです.

[#18311] Re: [book] csv_split2 — Koretsugu Daigoro <tmmcross@...> 1999/11/02

これつぐです。

[#18338] オブジェクトの非同一性判定 — Ayanosuke <aya@...>

 綾乃介です。

13 messages 1999/11/03

[#18539] [book] $*, etc. — Yasuhiro Fukuma <yasuf@...>

福間@福岡 です。

44 messages 1999/11/11

[#18580] — tokoma@... (中川 誠)

中川です。

44 messages 1999/11/14
[#18619] build on alpha — Go Nakagawa <nakagawa@...> 1999/11/15

もとの質問のかたとは別の中川です。

[#18737] Re: build on alpha — tokoma@... (中川 誠) 1999/11/18

中川です。

[#19144] Re: build on alpha — tokoma@... (中川 誠) 1999/12/04

中川です。長文で失礼します。

[#19341] Re: build on alpha — tokoma@... (中川 誠) 1999/12/09

中川です。

[#19344] Re: build on alpha — matz@... (Yukihiro Matsumoto) 1999/12/09

まつもと ゆきひろです

[#19400] Re: build on alpha — tokoma@... (中川 誠) 1999/12/10

中川です。

[#19426] Re: build on alpha — EGUCHI Osamu <eguchi@...> 1999/12/11

えぐち@エスアンドイー です。

[#19459] Re: build on alpha — tokoma@... (中川 誠) 1999/12/13

中川です。

[#19461] Re: build on alpha — EGUCHI Osamu <eguchi@...> 1999/12/13

えぐち@エスアンドイー です。

[#19506] Re: build on alpha — tokoma@... (中川 誠) 1999/12/14

中川です。

[#19520] Re: build on alpha — EGUCHI Osamu <eguchi@...> 1999/12/15

えぐち@エスアンドイー です。

[#19522] Re: build on alpha — matz@... (Yukihiro Matsumoto) 1999/12/15

まつもと ゆきひろです

[#19543] Re: build on alpha — EGUCHI Osamu <eguchi@...> 1999/12/15

えぐち@エスアンドイー です。

[#19562] Re: build on alpha — tokoma@... (中川 誠) 1999/12/15

中川です。

[#19569] Re: build on alpha — EGUCHI Osamu <eguchi@...> 1999/12/16

えぐち@エスアンドイー です。

[#19592] Re: build on alpha — tokoma@... (中川 誠) 1999/12/16

中川です。

[#18637] constant? — Kazuhiro Yoshida <moriq.kazuhiro@...>

もりきゅうです。

20 messages 1999/11/16
[#18640] Re: constant? — WATANABE Hirofumi <Hirofumi.Watanabe@...> 1999/11/16

わたなべです.

[#18650] Re: constant? — Kazuhiro Yoshida <moriq.kazuhiro@...> 1999/11/16

もりきゅうです。

[#18657] Re: constant? — matz@... (Yukihiro Matsumoto) 1999/11/16

まつもと ゆきひろです

[#18709] ADO にて datetime 型の取得 — Takashi SHIODA <tsio@...>

塩田です。

18 messages 1999/11/18
[#18779] Re: ADO にて datetime 型の取得 — Masaki Suketa<CQN02273@...> 1999/11/20

助田です.

[#18802] Re: ADO にて datetime 型の取得 — Takashi SHIODA <tsio@...> 1999/11/21

オレンジソフト塩田です。

[#18712] Re: header output in eruby — TAKEUCHi Kahori <take-k@...>

たけうちです。

16 messages 1999/11/18
[#18716] Re: header output in eruby — "NAKAMURA, Hiroshi" <nakahiro@...> 1999/11/18

なひです.

[#18830] mod_ruby-0.1.4 — TAKAHASHI Masayoshi <maki@...>

高橋征義です。

16 messages 1999/11/22

[#18853] initializer polymorphism? — Takeyuki Watadani <watadani@...>

渡谷といいます。

25 messages 1999/11/23

[#18911] Re: eRuby 変換後の無駄 (?) な改行 — TAKEUCHi Kahori <take-k@...>

たけうちです。

14 messages 1999/11/25

[#18914] Ruby standard GUI framework? — Hideto ISHIBASHI <s34204@...>

石橋秀仁です。

43 messages 1999/11/25
[#18975] Re: Ruby standard GUI framework? — 中村暁史 Nakamura Akifumi <BXQ04723@...> 1999/11/27

[#19020] Re: Ruby standard GUI framework? — Hideto ISHIBASHI <s34204@...> 1999/11/29

石橋秀仁です。

[#19026] Re: Ruby standard GUI framework? — Noritsugu Nakamura <nnakamur@...> 1999/11/29

[#19081] Re: Ruby standard GUI framework? — "Hideaki Takata" <hideakit@...3.dion.ne.jp> 1999/12/01

たかたです。

[#19092] Re: Ruby standard GUI framework? — Noritsugu Nakamura <nnakamur@...> 1999/12/01

[#19112] Re: Ruby standard GUI framework? — 中村暁史 Nakamura Akifumi <BXQ04723@...> 1999/12/02

[#19131] Re: Ruby standard GUI framework? — Noritsugu Nakamura <nnakamur@...> 1999/12/03

[#18948] 他言語との比較 — とみたまさひろ <tommy@...>

とみたです。

18 messages 1999/11/26

[ruby-list:18744] Re: paramclass

From: gotoken@... (GOTO Kentaro)
Date: 1999-11-18 22:41:09 UTC
List: ruby-list #18744
ごとけんです

In message "[ruby-list:18684] Re: paramclass"
    on 99/11/17, Shin-ichiro Hara <sinara@blade.nagaokaut.ac.jp> writes:

>なるほど、すると a == b ならば Pclass(a) == Pclass(b) であってほしい訳ですね。

その通りです。とくに foo = Pclass(a,b,c).new のとき
  
  foo.is_a? Pclass(a,b,c)

であって欲しいですね。さらに

  foo.is_a? Pcalss(a)

でもあって欲しい気もちょっとしますが、意味ないかな。

>単に append_features の「特異」版として考えたのです。include する所を
>extend したらどうなるかなあと。

なーる。

>                               でも extend_object を「特異的に使えば
>いい」のだと気づきました。(^^;
>こんな感じで。

うわあっ、すごい。僕にはこんなの書けません。理解するのにも、
しばらくかかりました ^^;;

ところで、インターフェイスについて考え直してみると、

>class Foo
>end
>Foo.extend ClassParameterizer

こんな感じで、そとから任意のクラスをパラメトライズ宣言できる
のには、なにか違和感を感じるようになりました。デフォルトのパ
ラメータは必須でなくても良いですが(抽象クラスみたいなかんじ)、
パラメータの意味はなにかしら明記したいこともあって、クラス定
義側でincludeするというのは変えたくない気がします。

TOPLEVEL_BINDING で eval するというアイデアだけを頂いて書き
直しました。最後につけます。例として、[ruby-list:18715]の固
定サイズな配列をパラメトリッククラスとして書いてみました。
FixedSizeArray(size, default) でクラスをあらわすモノです。

require "paramclass"

class FixedSizeArray
  include Parametric
  include Enumerable

  def size;           parameters[0];   end
  def default_value;  parameters[1];   end

  def self.[](*args); self.new(*args); end

  def initialize(*args)
    @ary = args
    s = @ary.size
    raise ArgumentError, "Too many initial values" if s > size
    @ary.fill(default_value, s, size - s)
  end

  def [](n)
    if n < -size or size <= n
      raise IndexError, "index out of range"
    end
    @ary[n]
  end

  def []=(n,v)
    if n < -size or size <= n
      raise IndexError, "index out of range"
    end
    ary[n] = v
  end

  def each(&blk)
    @ary.each(&blk)
  end

  def inspect
    @ary.inspect
  end
end

# example

p a = FixedSizeArray(5, "")["foo", "bar", "baz"]
  #=> ["foo", "bar", "baz", "", ""]
p a.is_a? FixedSizeArray(5, "")
  #=> true

#
# paramclass.rb
#

# begin: class variable emuration by Matz [ruby-dev:8245]
    class Module 
      private
      def module_attr(*names)
	names.each do |name|
	  name = name.id2name unless name.kind_of? String
	  self.module_eval <<-EOS
	  CV_#{name} = []
	  class <<self
	    def #{name}; CV_#{name}[0] end
	      def #{name}=(val); CV_#{name}[0] = val end
	      end
          EOS
	end
      end
    end

    class Class
      private
      alias class_attr module_attr
    end
# end: class variable emuration by Matz [ruby-dev:8245]

module Parametric
  def Parametric.append_features(mod)
    super mod

    # class generating function
    cn = mod.name
    eval "def #{cn}(*args); #{cn}.instance_eval{class_generate(*args)} end", 
    TOPLEVEL_BINDING

    mod.module_eval{
      class_attr :rootclass, :class_parameters, :classes
      @rootclass = true
    }

    mod.rootclass = mod
    mod.class_parameters = {}
    mod.classes = {nil => mod}

    def mod.class_generate(*args)
      args = nil if args.empty?
      klass = self::classes[args] || self::classes[args] = Class.new(self)
      klass.class_parameters[klass] = args unless klass.rootclass?
      klass
    end

    def mod.parameters
      if rootclass?
	defined?(default_parameters) ? default_parameters : []
      else
	res = nil
	self.ancestors.find{|i| res = class_parameters[i] }
	res
      end
    end

    def mod.rootclass?
      @rootclass
    end
  end

  def parameters
    self.type.parameters
  end
end


########## devel test ##########

if __FILE__ == $0
  def xmp(arg, show = true) # prints expample code and result line by line
    if show
      __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"
      }
    else
      print arg; eval arg
    end
  end

  xmp <<-EOS, nil
    class C
      include Parametric

      def C.default_parameters
	[100]
      end
    end

  EOS

  xmp <<-EOS
    C.parameters
    C(10).parameters
    C(10).id == C(10).id
    C(20,10) < C

    C.rootclass
    C(10).rootclass

    C.rootclass?
    C().rootclass?
    C("foo").rootclass?

    D = C(0)
    C(0)
  EOS

  xmp <<-EOS, nil

    class Bar < D; 
      include Parametric
      
      def Bar.default_parameters
	superclass.parameters + [""]
      end
    end

  EOS

  xmp <<-EOS
    Bar.rootclass
    Bar.parameters
    Bar.new.is_a? D
    Bar.new.is_a? C(0)
    Bar.new.is_a? C(10)
  EOS
end

In This Thread