`(kakko ,man)

Find a guide into tomorrow by taking lessons from the past

Lisp Game Programming 再履修 <その8> アクセスログ プチ整形

ささくれだった気持ちで書いていたせいか、ちょっと見逃していた。
クライアントサーバ型ゲームの実験をしていたら気がついたんだけど、前回のプログラムコードではアクセスが連続するとこんな感じになる。
f:id:tomekame0126:20161216132732p:plain

醜い(見にくい)じゃん!
なので、Windows 用にプチ整形実施。

これを

;; Step2 <Access Log>
;; -----------------------------------------------------------------------------------------------
(defparameter *log-file* "C:\\work\\Server-log.log")

(defun Log-event (strings &rest args)                       ; <-- attention! args to list 
  (multiple-value-bind (second minute hour date month year day daylight-p zone)
      (decode-universal-time (get-universal-time))          ; get time
    (declare (ignore day daylight-p zone))                  ; need not day,daylight-p,zone
    (let ((message (apply #'format nil strings args)))      ; message <-- format function
      (with-open-file (stream *log-file*                    ; open log-file 
                       :direction :output                   ; output
                       :if-does-not-exist :create           ; if not exist create
                       :if-exists :append)                  ; if exist append

        (format stream "~4,'0D-~2,'0D-~2,'0D ~2,'0D:~2,'0D:~2,'0D ~A ~%"
                year month date hour minute second          ; output Y M D H M S message
                message)))))

こんな感じに整形!
本当にプチです。へへ!

;; Step2 <Access Log>
;; -----------------------------------------------------------------------------------------------
(defparameter *log-file* "C:\\work\\Server-log.log")

(defun Log-event (strings &rest args)                       ; <-- attention! args to list 
  (multiple-value-bind (second minute hour date month year day daylight-p zone)
      (decode-universal-time (get-universal-time))          ; get time
    (declare (ignore day daylight-p zone))                  ; need not day,daylight-p,zone
    (let ((message (apply #'format nil strings args)))      ; message <-- format function
      (with-open-file (stream *log-file*                    ; open log-file 
                       :direction :output                   ; output
                       :if-does-not-exist :create           ; if not exist create
                       :if-exists :append)                  ; if exist append

        (format stream "~4,'0D-~2,'0D-~2,'0D ~2,'0D:~2,'0D:~2,'0D ~A~C~C"
                year month date hour minute second          ; output Y M D H M S message
                message
                #\return #\linefeed)))))                    ; output CR/LF for windows!

注)ログファイルの名前が違うのは、実験用のプログラムコードに組み込み、名前を変更して使用しているため。

すると、ちょっとは見やすくなったかな?
でも、なんかどうも、うーん。
f:id:tomekame0126:20161216134838p:plain

~% の動作のため、Unix系OS( LF ) 、Windows( CR/LF )、Mac( CR )の違いや処理系の違いを考慮して「場合分け」して書くのは「美しく」ないよね?
ポータビリティがプログラムコードの「キモ」だと思うけど。