| 77 暦法の命名規則 |
Ruby版の when の開発が2002年の3月で一時止まっている理由は、実は暦法の命名規則にエレガントなルールを見出せないことに原因があります。
http://hosi.org/a/date/Extended.htm
の各オブジェクトインスタンス生成メソッドでは、暦法を指定するのに、あらかじめ生成しておいた calendar オブジェクトか、または、文字列によって指定された calendar オブジェクトを新規に生成して使います。
ここでひとつ「同一の文字列によって指定される calendar オブジェクトの内容は、同一でなければならない」という大きな要請があります。これが満たされないと when を使うアプリケーションが、簡単に見つからないバグを抱える危険があると思うのです(逆は真ならずで「同一の内容の calendar オブジェクトが複数の文字列に対応すること」は問題ありません)。
これは一見簡単なことのように思われます。'GregorianCalendar'はグレゴリオ暦の calendar オブジェクトに対応させればいい('Gregorian','グレゴリオ' も「逆は真ならず」の通り問題ない)。
こういう単純な場合にはほとんど問題はありません。問題はバリエーションの多い暦の場合にあるのです。そこで、もっともバリエーションが多いと思われるインド暦の場合について検討し、暦法の命名規則を定義しようと考えました(これがクリアできれば命名規則のルールとして充分と判断したため)。インド暦のバリエーションについては、
http://hosi.org/a/when/when2.html#26
に説明があります。これを読めばおわかりのように、暦法を指定する文字列は、少なくとも、
1.太陽暦か、太陰太陽暦か
(または太陰太陽暦をベースに紀年のみ太陽暦にするか)
2.暦計算に現代天文学を用いるか、伝統的な天文定数値を用いるか
3.暦計算を地上のどの地点(経緯度)を基準に行うか
4.1ヶ月を新月で終わらせるか、満月で終わらせるか
5.閏月の表現をどの方式にするか(下記「日付時刻の基本表現」表b)
http://hosi.org/a/date/Abstract.htm#label:7
6.紀年法をシャカ暦にするか、ヴィクラマ暦にするか
7.紀年法の元年は1年(「数え方式」)か、0年(「満方式」)か
8.1年の初めの月をどの月にするか
を指定できなければなりません。例えばこんな感じ...
'Indian_Luni_Solar_Calendar_by_Modern_ephemeris_notation_Amanta_begun_from_Saka_Chitra_location_Mumbai'
自然言語風にしようとするとこうなってしまいます。しかし、長くなりすぎて実用的ではありません。3月時点で考えた解決策としては、
A.原則として上記のような文字列の大文字部分のみ意味ありとする
(頭文字を並べた文字列 ILSMAS... が上記と同じ calendar オブジェクトと対応することをルール化する)
しかし、これでは Japanese_Calendar, Javanese_Calendar, Jewish_Calendar などの識別が逆に不自然になります。
calendar オブジェクトを文字列で同定することを放棄する解決策も考えられます。配列やハッシュを使ったり、Symbol を使ったりという方法です。
ただ、ほとんどすべての場合に文字列でうまくいくであろうことを考えると(*)、calendar オブジェクトを文字列で同定することを放棄する解決策がエレガントには思えないのです(これは、私のこだわりかもしれません)。
(*)中国の太陰太陽暦もインド暦に匹敵するくらいバリエーションが多いのですが、幸いそれぞれの暦に公の名称があるので、文字列で特定できます。
そういうわけで、ここ半年、他のことをやっていて、when の Ruby化がストップしてしまっているわけです。
これをお読みの皆さんのお知恵を拝借できないかと思っている次第です。
〔ツリー構成〕
| 【77】 暦法の命名規則 2002/12/4(水)06:50 suchowan (3050) |
| ┣【78】 re(1):暦法の命名規則 2002/12/4(水)06:52 suchowan (177) |
※ 『クリックポイント』とは一覧上から読み始めた地点を指し、ツリー上の記事を巡回しても、その位置に戻ることができます.