Siena. です。

なんだか、引っかき回した上に間が空いてしまってすみません。

▼ [ruby-list:35304] < Shin'ya Adzumi さん

》> |刻み幅を指定できるくらいはできてもいいように思います。> |それを Range (or another) が担うのか #succ が担うのかはともかく。>> それはRange#stepでは?
》
》to_a するときに、という話かと思ってましたが、どうなんでしょう。

あづみさんのご指摘のように、to_a でというのを考えていました。
succ, each の話と to_a の話が入り乱れていて、ちょっと混乱気味
だったように思います。更に、[ruby-list:35301] で、Range#step に
触れたのも、もしかするとそれに拍車をかけてしまったかもしれません。


自分なりに整理するため、疑似コード (以下、Range4 ^^;) を
書きながら [ruby-dev:6018] 以下を読んだりしていたのですが、
概念的には両端の開閉も含めて Range3 に類似するものでした。
[ruby-dev:6244] までを読むと、Range3 は「整数値の列」
という事でしたが、基本的にここだけが異なる点でした。

Range4 では、Enumerable を Range4 が表す{連続,離散}区間中の
離散的な部分集合を切り出し、その上を走査するものと位置づけました。
整理させていただきますと、Range4 は次のようになります。
# 基本的には解釈を変えて見直したというところで、
# 目新しい事はなく冗長な説明かもしれません

1. Comparable な (全順序が定義された) 集合中の連続した区間を表す
2. 刻み幅を属性として持つ、(定規のような) 目盛り付きの区間として扱う
3. Enumerable のメソッドは、この刻み幅ずつ走査する

Range4 の基本的な定義は 1. で、「連続した区間 (*)」を第一義とします。
基本的に全順序集合上で定義される事を前提としているので、仮に
区間演算が定義されたとした時、連続区間/離散区間のいずれであっても、
この区間演算は機能する (ように自然に作れる) と期待できます。
少なくとも互換性のある全順序集合上の区間どうしであれば、ですが。

(*) 稠密な集合である「連続区間」と、両端点を除いて、隣合う全ての
    要素が含まれている (空のない)「連続した区間」を区別しています

これに、Enumerable という特殊な一面を持たせるのが 2. と 3. です。
2. の resolution (scale resolution) は Range4 作成時に与えられ、
デフォルト値は、数なら (全順序集合上で定義される) 単位量、さもなくば
succ 1 回または単位量とし、単位量が定義されていなければ 1 とします。
3. の動作の基本となる each は、数ならば + を、
それ以外なら succ または + を利用するように定義します。
この辺りは、[ruby-dev:17228] からの議論と基本的に共通すると思います。
最初は + 優先で考えていたのですが、やはり String などが。
もう一つ、+ 相当のメソッド xxx を仮定して、xxx -> + -> succ の順で
最初に見つかったもので each を定義するというのも案としてあります。
Range4 の要求事項が多くなってしまうため、ひとまず保留しました。
xxx がなければないで、+/succ を使うので気にする必要ないかもですが。

ちょっと、先走った事になりますが、与えられた resolution が
負であれば、上記とは逆方向の走査をする事としました。
即ち、Range4.supremum を起点として Range4.infimum の方向へ走査し、
その動作は、+/succ ではなく -/prec (precede) に従うとしました。
もちろん、これらが定義されていない時にはエラーとします。
あえて分けたのは、succ しかできない、もしくは prec の実装が困難、
succ と実装が全く異なるという場合もあるかもしれないと考えたからです。

Enumerable のメソッド名が汎用的なものなので連続区間には
そぐわないものもありますが、そこは便宜のため目をつむりました ^^;
必要なものは、別のメソッドとして定義するという方向で。
メソッドを再定義して既存のスクリプトと共存できなくなっても
困りますし、再定義不可能もしくは困難なものも多く、一部だけが
Enumerable と異なるというのも混乱を招きやすいと判断したためです。
Enumerable との互換性に問題がなく、かつ明確に定義可能であれば、
再定義してしまってもいいかもしれませんが、判断が難しいですね。

更に余談ですが、resolution に nil を与えられた時に、Enumerable の
メソッドを無効にして、連続区間として定義可能なものだけ再定義するとか、
連続区間なメソッド優先と Enumerable のメソッド優先の切替を可能に
するとか、姑息な事も考えてみましたが、これは案の定いまいちでした ^^;;


》[ruby-dev:6184]> Range#sizeとRange#to_a.sizeが違うのは避けたいです.

この点については、次のような定義を与えてました。
Range4#size := Range4.to_a.size
Range4#length := Range4.supremum - Range4.infimum


現在のスタンスをまとめてみましたが、余り進展らしい
ものも見られず、取り留めもなく長くなってしまいました。
まだ自分の中で検討が足りないようです。
あまりごちゃごちゃという資格がないですね ;_;

---
Siena. <mailto:siena / cr.chiba-u.ac.jp>