Shammer's Philosophy

My private adversaria

パッケージ名の取得を楽チンにしたい

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 がログに残るだろうと思ったがそうはならなかった。まだまだいじり倒し具合があまいな。。。