scheduleマクロ修正

曜日計算がたまに動作しないバグを修正、うるう年対応はあいかわらず省略。

oedit.scmに以下追加。キーは適当に。

;; schedule

(define (schedule)
  (lambda()
    (begin
      (define weekday (list "日" "月" "火" "水" "木" "金" "土"))
      (define lastday (list 31 28 31 30 31 30 31 31 30 31 30 31))

      (define tm (sys-localtime (sys-time)))
      (define tm-year (+ 1900 (slot-ref tm 'year)))
      (define tm-mon  (+ 1 (slot-ref tm 'mon)))

      (define dt (app-input-box "yyyy/mm" (string-append (number->string tm-year) "/" (number->string tm-mon) )))
      (if (not dt) 
        () ;cancel
        (begin
          (if (>= (string-length dt) 6) 
            (begin
              (define year (substring dt 0 4))
              (define month (substring dt 5 (string-length dt)))
              (define tm-year (string->number year))
              (define tm-mon (string->number month))
            )
            (begin
              (app-status-bar-msg "入力エラー")
              (exit)
            )
          )
        )
      )

      ;タイトル行
      (editor-paste-string  (string-append ";----- " year "年" month "月 -----" "\n"))

      ;月の一日の曜日計算
      ; ツェラーの公式 w = y+[y/4]+[h/4]-2h+[13(m+1)/5]+d , 曜日=(w mod 7) , 1:日〜6:金 0:土 , []...floor
      ; oeditでは "- 数字型は32bit整数値のみサポート" なのでfloorはとりあえずなし
      ; 負の値への対応、sys-tmの曜日と同じ値を出すために調整 … 曜日=((w+6) mod 7)
      (define H (string->number (substring year 0 2)))
      (define Y (string->number (substring year 2 4)))
      (define M (string->number month))
      (define D 1)
      (define wday (remainder (+ Y (/ Y 4) (/ H 4) (* -2 H) (/ (* 13 (+ M 1)) 5) D 6) 7))

      ;日の一覧
      (do ((i 1 (+ i 1))) ((> i (list-ref lastday (- tm-mon 1))) ())
        (begin
          (define pr-day (number->string i))
          (if (>= 9 i) (set! pr-day (string-append " " pr-day)))
          (editor-paste-string (string-append pr-day "(" (list-ref weekday wday) "):" "\n"))
          (set! wday (remainder (+ wday 1) 7))
        )
      )
    )
  )
)