[Date Prev] [Date Index] [Date Next]
[Thread Prev] [Thread Index] [Thread Next]

[xyzzy:03592] Re: sub-class でなければ sub-closure というんでしょうか、



亀井さん、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)
-+-------------------------------------+-

Index Home