今月のカレンダーを Squeak Smalltalk で
プログラム演習、カレンダーを作れますか? - @author pyridoxin に対する Squeak Smalltalk を使った解答例。
結果はクリップボードに入るので、コードを評価(選択して do it (alt + d))後、適当な場所でペースト操作を行なってください。ペースト先が Squeak 環境内の場合は、日曜は赤、土曜は青で、前後の月の日は灰色に、当日は太字になります。
May 2008 Su Mo Tu We Th Fr Sa 27 28 29 30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| textColor today thisMonth stream font text | today := Date today. thisMonth := today month. textColor := [:colorSym | TextColor color: (Color perform: colorSym)]. stream := WriteStream with: thisMonth printString asText. stream cr. stream nextPutAll: (' Su' asText addAttribute: (textColor value: #red)). stream nextPutAll: ' Mo Tu We Th Fr'. stream nextPutAll: (' Sa' asText addAttribute: (textColor value: #blue)). thisMonth weeksDo: [:week | stream cr. week datesDo: [:date | | dateText | dateText := (date dayOfMonth printString forceTo: 3 paddingStartWith: $ ) asText. date = today ifTrue: [dateText addAttribute: TextEmphasis bold]. #(Sunday red Saturday blue) pairsDo: [:wday :color | date weekday = wday ifTrue: [dateText addAttribute: (textColor value: color)]]. date month = thisMonth ifFalse: [dateText addAttribute: (textColor value: #gray)]. stream nextPutAll: dateText]]. font := (TextStyle named: #BitstreamVeraSansMono) defaultFont. text := stream contents addAttribute: (TextFontReference toFont: font). Clipboard clipboardText: text