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

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



花井さん、こんにちは。

        Wed, 17 Nov 1999 22:34:47 +0900 の
        [xyzzy:03592] Re: sub-class でなければ sub-closure というんでしょうか、
        への返事です.

| で、この度の亀井さんのも同じ状態になってしまいました。

あー、ですね(^^;
shadow の前にバッククオートが展開されるので、intern す
る時点では、まだ lisp パッケージの make-vector が見え
てますね。

というわけで、こうすれば intern するときには lisp パッ
ケージの make-vector は見えなくなります。

(defmacro shadowing-defun (name (&rest lambda-list) &body body)
  (shadow (symbol-name name))
  `(defun ,(intern (symbol-name name)) ,lambda-list ,@body))

で、インタプリタではこれでいいんですが、コンパイルする
とまた状況が変わってくるので、以下のようにすればオッケ
ーなはずです、たぶん。

(defmacro shadowing-defun (name (&rest lambda-list) &body body)
  (shadow (symbol-name name))      ; これはインタプリタ用
  `(eval-when (:compile-toplevel :load-toplevel :execute)
     (shadow (symbol-name ',name))  ; これはコンパイル後のロード用
     (defun ,(intern (symbol-name name)) ,lambda-list ,@body)))

ついでにこっちも。

(eval-when (:compile-toplevel :load-toplevel :execute)
  (defvar *test-package* (defpackage "test")))

| (shadow 'lisp::make-vector)
| (defun make-vector ()
|   t)
| 
| ではちゃんと独立定義がなされるのですが...。

S 式が分かれていれば、(shadow ...) が評価されて、
make-vector が shadow されてから (defun make-vector ...) 
が読まれるので、うまくいきます。

--
亀井哲弥(Tetsuya Kamei)
kamei@xxxxxxxxxxxx/JCA00343@xxxxxxxxxxx

Index Home