次のAPLの式が何を計算しているかわかったあなたは…を Squeak Smalltalk で

次のAPLの式が何を計算しているかわかったあなたは...
もう、APLにはまっている!


http://homepage3.nifty.com/ysaigusa/jp/apl/guide/youbi.gif

http://homepage3.nifty.com/ysaigusa/jp/apl/guide/index.html


いや。はまってはいないのですが、だいたいは分かるので Squeak Smalltalk に意訳して動きを見てみるテスト。

| D U M Y G |
D := #(1997 12 8).
U := (D first \\ 100 ~= 0 and: [D first \\ 4 = 0]) or: [D first \\ 400 = 0].
U := U ifTrue: [1] ifFalse:[0].
M := {0. 31. 28 + U. 31. 30. 31. 30. 31. 31. 30. 31. 30}.
M := (1 to: M size) collect: [:idx | (M first: idx) sum].
Y := D first - 1.
U := {Y. Y. Y} // #(4 100 400).
G := (M at: D second) + D third + (365 * Y) + U first + U third - U second.
G   "=> 729366 "


一つ目の U はしかたがないとして、M と二つ目の U がちょっと残念なことに。

DateAndTime オブジェクト同士の演算機能を使って素直に書けば、こんなふうでしょうか。

| origin |
origin := (Date year: 1 month: 1 day: 1) - 1 day.
('12-8-1997' asDate - origin) days   "=> 729366 "