Shammer's Philosophy

My private adversaria

パッケージ名の取得でコケた・・・

パッケージ名の取得を楽チンにしたい - Shammerismで試したときは問題なかったはずだが、コンパイルしたあとでは想定した動作にならなくなってしまった。eval-when という関数があるようで、、、CLHS: Special Operator EVAL-WHENを読んでも、というか読みきれなかったが、パフォーマンスは気になるがマクロにすることで期待通りの動作を実現できた。

p1-main.lisp

(load "p1.lisp")
(load "p2.lisp")

(defun main ()
  (p1:hello "Taro")
  (p2:call-hello "Jiro"))

(main)

(save-application "test" :toplevel-function #'main :prepend-kernel t)

(quit)

p1.lisp

(defpackage "P1"
  (:use "CCL" "COMMON-LISP" "COMMON-LISP-USER")
  (:export "HELLO"))
(in-package "P1")

(defmacro hello (name)
  `(format t "[~A]Hello, ~A!~%" ,(package-name *package*) ,name))

p2.lisp

(defpackage "P2"
  (:export "CALL-HELLO")
  (:use "CCL" "COMMON-LISP" "COMMON-LISP-USER"))

(in-package "P2")

(defun call-hello (name)
  (p1::hello name))

実行結果

$ ccl64 -l p1-main.lisp
[COMMON-LISP-USER]Hello, Taro!
[P2]Hello, Jiro!
$ ./test
[COMMON-LISP-USER]Hello, Taro!
[P2]Hello, Jiro!
$