須賀です。どうもコメントありがとうございます。

>  When はちょっと漠然としすぎじゃないでしょうか。こういうのは
> ruby-talk に振ってみれば一発でその違和感を分かりやすく説明して
> くれると思います。投げてみてはいかがでしょうか。
When.exe という言葉はもう10年以上使っているので、自分では客観的に判断で
きなくなっているのだと思います。ただ、ruby-talk ないし comp.lang.rubyに
投げるには、それなりにドキュメントを英語にしてからでないと厳しいでしょう
(日本語ですら話がかみ合わない場合があるわけだし)。

>  私が今思いつくのは、クラス階層を導入して Calendar::Date とか
> Date::Extended みたいにするのが分かりやすそう、ということくらい。
> 標準クラスではほかに例がなさそうなのでボツかな?
文法的な制約として、autoload できるのは、:: のつかない定数のみである
という点があるので、Calendarクラスのサブクラスをクラス階層の中にいれ
ることはできません。そのことが盲点になっていて、Date そのものには、
その種の制限がないことに思い至っていませんでした。

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 when.rb  〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
class Date
  class Extended < Date
    def Extended.return_date_or_extended(date)
      (諸々のメソッドの終わりで日付オブジェクトを返すときに呼ばれて)
      拡張日時オブジェクト date の date.cal が Civil で、date.zone が
      固定タイムゾーンのときは date を Date クラスのオブジェクトに
      変換して返す。どちらかの条件が成立しないときには、拡張日時オブ
      ジェクトをそのまま返す。既存のDateから継承されているか、newdate
      から継承されているかでタイムゾーンの有無が変わるので、どちらから
      継承されても良いように配慮が必要かもしれません。
    end
    ...

  end # of Date::Extended Class definition


  ## Additions to Date Class

  def Date.utc(暦法オブジェクトまたは文字列, y, m, d,...)
    DateクラスまたはWhenクラスのインスタンスを作って返す
    暦法オブジェクトまたは文字列が省略されるケースは Dateクラスで閉じるので、
    本メソッドで暦法指定を省略可とする必要がないことに気づきました。
    日付が正しくない場合は例外を発生する
   (タイムゾーンはグリニジ標準時)
   date = ...
   Date::Extended.return_date_or_extended(date)
  end

  def Date.local(暦法オブジェクトまたは文字列, y, m, d,...)
    Dateクラスまたは拡張日時クラスのインスタンスを作って返す
    日付が正しくない場合は例外を発生する
   (タイムゾーンはローカル)
   date = ...
   Date::Extended.return_date_or_extended(date)
  end

  def Date.when?(暦法オブジェクトまたは文字列, y, m, d,...)
    Dateクラスまたは拡張日時クラスのインスタンスを作って返す
    日付が正しくない場合は nil を返す
   (タイムゾーンはローカル)
   date = ...
   Date::Extended.return_date_or_extended(date)
  end

  def to_date_extended Dateオブジェクトを拡張日時オブジェクトに変換して返す end
  def new_calendar(cal)  to_date_extended % cal    end; alias_method :%, :new_calendar
  def new_zone(zone)     to_date_extended | zone   end; alias_method :|, :new_zone
  def new_period(period) to_date_extended / period end; alias_method :/, :new_period
  def [](key) # 暦注を参照するメソッド
    strftime で %[暦注] という書式を想定すると、整合性から暦注参照は[]メソッドがよい。
    to_date_extended[key]
  end

  def jdn ... end # これらの計算は Date クラスで閉じる。一部は既定義のものの別名
  def jdf ... end #   〃
  def sd  ... end #   〃
  def sdn ... end #   〃
  def sdf ... end #   〃

  alias_methld :+!, :+
  def +(other)
    return +!(other) unless other === String
    return to_date_extended + other
  end 
    
  alias_methld :-!, :-
  def -(other)
    return -!(other) unless other === String
    return self.to_date_extended - other
  end 
end  
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
のよう Extended という名前にして、Date で囲ってやればユーザからみて
違和感がなさそうです。これで少し進めて、ドキュメントが整ってきたら、
comp.lang.ruby にも振ってみたいと思います。

Calendarクラスのサブクラスの名前に今は「謎の」0,1,2がついていますが、
これも何らか原則を建てて見直したいと思います。

-- 
////////// 須賀 隆 ///////////////////////// SGB02104 / nifty.com ////////
// http://www.asahi-net.com/~dd6t-sg/ mailto:suchowan / box.email.ne.jp //