anchor.diff:                (scr-format "~a ~a位 ~2,'0d:~2,'0d:~2,'0d ~a~%"
                             arrow place h m s entry-name))))))
   
  +;; ランキングを更新する。ランキングファイルからデータを読み込み、1引数
  +;; の関数 fun にランキングデータを渡す。fun の返り値をランキングファイ
  +;; ルに保存する。
  +;;
  +;; TODO: 別のプロセスがランキングを同時に変更しないようにロックすべき。
   (defun ranking-transaction (fun)
     (flet ((read-ranking ()
                          (with-open-file (file +ranking-file-name+
  
positive.code:                                            (let ((buf (make-string (file-length file))))
                                               (read-sequence buf file)
                                               (read-from-string buf))
                                           ;; return empty ranking if file doesn't exist
                                           '())))
           (write-ranking (ranking)
                          (with-open-file (file +ranking-file-name+
  
negative.code:     (let ((ranking (read-ranking)))
          (write-ranking (funcall fun ranking)))))
  
  ;; メッセージ message を表示し、ユーザーから 1 あるいは 2 を受け取る。
  ;; 1 を受け取れば t を、さもなくば nil を返す。
  (defun yes-no-dialog (message)
    (scr-format "~a(yes=1 or no=2)~%" message)
    (= 1 (read-command-char)))
  
  ;; クリア記録 total-seconds をランキングファイルへ登録時のダイアログ。
  (defun ranking-dialog (total-seconds)
    (when (yes-no-dialog "ランキングに登録しますか？")
      (scr-format "名前を教えてください:~%")
  