日付の順序の比較

日付AからBまでの間の日付を列挙する関数「日付列挙」を作って、初心者掲示板でサンプルとして提示しました。

「日付列挙」関数
# 日付AとBの間の日付を全て列挙。列挙するのは、A,A+1日,……,B-2日,B-1日 まで
●日付列挙({文字列}Aから{文字列}Bまでの)
 日付とは文字列=A。返り値とは配列
 日付がBでない 間
  返り値に日付を配列追加
  日付=日付に`+0/0/1`を日付加算
 返り値を戻す
 

で、例外処理もしてないカップ麺コードなので、A>Bで指定したり(中略)しないように、と本来考慮すべき例外について一言だけ付け加えておきました。そしたら見事に質問者さん、もしA≦Bならばという一文を付け加えて完成したプログラムをレスしてくれました。最初はしまった、と思いましたよ。日付データをA≦B比較できるはずがないと思ってたからです。あ〜、きちんと日本語で説明すべきべきだった、とちょっと後悔…… ところが、あれ?ちゃんと比較できてる!

僕は単純に日本語的としてA>Bと説明しただけであって、まさか日付データに対して比較演算子が使えるとは思ってなかったわけですが、実は日付データ、もっと言うと文字列一般にも比較演算子を使うことができるのです。まぁもう既に気付いてる人もいるかもしれませんが、「文字列比較」「文字列辞書順比較」という命令があるので、これが使われてるわけですね(恐らく前者の方かな)

日付の順序比較
ある日=`2008/08/16`
もしある日<今日ならば
 「{ある日}は今日よりも過去です」と言う
違えば
 「{ある日}は今日、もしくは今日よりも未来です」と言う 
 

あくまで文字コードとして比較しているわけですから、被比較項の日付どうしがきちんと性質の良いフォーマットに統一されている必要があります。なでしこの日付関連の命令は「yyyy/mm/dd」というフォーマットを採用しているのでOKですが、違うフォーマットでは例えば`1月2日`>`1月10日`は真と判断されてしまいNGです。

ところでこれって日記ってよりもTipsに書くべきですね。まぁ、そのうち移植するときのための備忘録ということで(汗;;

部品の動的/静的

これまた質問掲示板から。ナデシコするや母艦設計、関数の中では部品の"静的"生成はNGと回答したら、その仕様がマニュアルやリファレンスに載っていないこと(中略)は、ちょっといただけないかもしれません、と言われてしまいました。ぐぐぐ、ちょっと痛い。確かに、マニュアルには直接は載ってないんですよ。でもこれ、慣れてきたなでらーにはある意味当たり前の事実、というかこの辺を乗り越えてこそ、なでらー@初心者を脱出することができるという、一つの重要な壁だと思うんです。

直接的にこそ言ってないが、マニュアルで遠回しに説明されている箇所を挙げると、グループについての説明の所。このグループに関する説明を一通り読むと、確かに「静的」「動的」という言葉が現れてきます。引用すると:

  • 「の」を使ったメンバ変数へのアクセスではグループにメンバが属しているか厳しいチェックを行うが、以下の「→」を使ったアクセスでは、実際変数の値取得時にだけメンバをチェックする。
  • グループのメンバは、『グループのメンバ』と指定しますが、この方法だとプログラムの実行時に、静的な指定しかできません。グループのメンバを動的に決定するには、『グループ@(変数名)』のように、@を使うとメンバを変数や文字列で指定することができます。
  • もし、関数内で動的に生成したい場合などは、『作成』命令を使います。そして、動的に生成したメンバにアクセスするには、『(変数名)→(メンバ名)』あるいは『(変数名)@「(メンバ名)」』のように、変数にメンバが属することを明示する必要があります。

でもこの3つの文章、バラバラの位置に表れてくるし、「静的」「動的」に関する説明そのものというより、何か回避策の提示…ぶっちゃけ言い訳がましい説明でしかないと言うか。

実際にこれらの説明だけから「静的生成」「動的生成」まで理解するのは困難で、前提知識として「GUI部品はグループ」「ローカル・グローバル変数」「なでしこの構文木解析」あたりを漠然とでも理解している必要があると思う。つまり、要経験値。

………コミッタとして仕様書っぽいものとか整備されたマニュアルを書く必要があるようです。うぎゃー。結局これも備忘録。