[xyzzy:03592] Re: sub-class でなければ sub-closure というんでしょうか、
- Subject: [xyzzy:03592] Re: sub-class でなければ sub-closure というんでしょうか、
- From: HANAI Tohru <honey@xxxxxxxxx>
- X-mailer: Mozilla 4.7 [en] (Win98; I)
亀井さん、masahito さん、こんにちは。
花井です。
おこたえありがとうございます。状況はちょっとかわったんで
すけど、よろしくない感じです。
# あ、xyzzy は 0.1.0.110 です。
eval-when は既にやったことありまして (^^; 、lisp パッケー
ジのを上書きしつつ、新規パッケージ内には関数が定義されな
いという状態になってしまうんです。
で、この度の亀井さんのも同じ状態になってしまいました。
# (si::*package-internal "test") をすると
# (test::make-vector) がみえるのですが、いざ呼ぶと、
# 「関数が定義されていません。」と叱られます。
> (test::shadowing-defun lisp:make-vector (test::LENGTH test::INIT) ...
>
> のように読まれてしまっています。その後で shadow しても
> もう遅いってわけですね。
うむむ。でも、
(defpackage "test")
(in-package "test")
(shadow 'lisp::make-vector)
(defun make-vector ()
t)
ではちゃんと独立定義がなされるのですが...。
また、マクロを二つにわけて
(defmacro shadow-func (func)
`(shadow ',func))
(defmacro defun-defun (name (&rest lambda-list) &body body)
`(defun ,name ,lambda-list ,@body))
(defun-defun make-vector (LENGTH INIT)
t)
としてもうまくいっちゃうんです。なので
(defvar *test-package* (defpackage "test"))
(in-package "test")
(defmacro shadowing-defun (name (&rest lambda-list) &body body)
(let ((new-name (intern (symbol-name name) user::*package*)))
`(progn
(and (fboundp ',name)
(not (eq *package* (symbol-package ',name)))
(progn
(shadow ',new-name)
(ed::message-box "hi")
(plain-error "もう一度。")))
(defun ,new-name ,lambda-list ,@body))))
(shadowing-defun make-vector (LENGTH INIT)
(lisp::make-vector LENGTH :initial-element INIT))
も、二回ほど eval-buffer するといい具合になります。
でも二回やるのは具合わるくて。
# plain-error の代わりに gc 呼んだら変わるかと思いましたが
# 毛ほども変わりませんでした。
うーん、マクロでやろうとするのがよくないんでしょうか?
-+-----------------+-------------------+-
花井 達 (honey@xxxxxxxxx)
-+-------------------------------------+-