今年1月の最後の日曜日は?


ruby-talk:271046 - Finding the last Sunday of a month より。ただし、もちろん Ruby ではなくて Squeak Smalltalk で(^_^;)。


最初に考えたのは、こんなかんじの。

| thisJan |
thisJan := Month month: #Jan year: Date today year.
thisJan dates reverse detect: [:date | date weekday = #Sunday]


#detectLast: みたいなのがないので reverse しないといかんのが痛い。日付だけ整数で返せばいいのであれば、#findLast: で返されるインデックスが日付と一致する(Smalltalk ではインデックスは0スタートではなく1スタート)のを利用してこんなふうにも。

thisJan
thisJan := Month month: #Jan year: Date today year. thisJan dates findLast: [:date | date weekday = #Sunday]


ついでに、くだんのスレで出ている Ruby での回答を直訳気味に。

| d |
d := Date year: Date today year month: 1 day: 31.
^d - (d weekdayIndex - 1) days


コスト高ですが、叙述的で読んですぐ意味が分かる二つ目(あるいは一つ目)のほうが好みです。状況や要求を話して聞かせるように書けて、しかし、コストのことは考えなくとも効率よく実行してくれる言語処理系が欲しくなります。