パッケージ名の取得を楽チンにしたい
Lisp のプログラムでログを記録するとき、どの処理で記録したものかわかりやすくするために、ログの中にパッケージ名を残したい。でも、そのログを残す関数名を logger として、
(logger (package-name *package*) "Any messages")
というように、毎回 (package-name *package*) を実行するとか、実行のたびにパッケージ名を同時に渡すというように書くのは面倒だ。そう、要は実行のたびに呼出し元のパッケージを取得するように (package-name *package*) を毎回実行するように書いてやればいい。
? (defpackage "MYLOGGER" (:use "CCL" "COMMON-LISP" "COMMON-LISP-USER")) #<Package "MYLOGGER"> ? (in-package "MYLOGGER") #<Package "MYLOGGER"> ? (defun logger (message) (format t "[~A] ~A~%" (package-name *package*) message)) LOGGER ? (logger "Hi, How are you?") [MYLOGGER] Hi, How are you? NIL ? (in-package "COMMON-LISP-USER") #<Package "COMMON-LISP-USER"> ? (mylogger::logger "Thanks, I'm fine!") [COMMON-LISP-USER] Thanks, I'm fine! NIL ?
ちょっと意外だったが、関数に含めてやることで実現できそうだ。MYLOGGER パッケージで実行すればログには MYLOGGER が、COMMON-LISP-USER パッケージで実行されれば COMMON-LISP-USER がログに残った。想像では、上の書き方だとどのパッケージから呼出しても MYLOGGER がログに残るだろうと思ったがそうはならなかった。まだまだいじり倒し具合があまいな。。。