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

Re: Lexical references in DEFMACRO



    Date: Mon, 5 May 86 20:04 EDT
    From: David A. Moon <Moon@SCRC-STONY-BROOK.ARPA>

	Date: 5 May 86 15:25 PDT
	From: Gregor.pa@Xerox.COM

	Another problem with having the lexical environment of a defmacro'd
	macro be the null environment is that you can't "macroize for speed" the
	following perfecly reasonable coding style:
 
	(let ((unique-id "foo"))
	  (defun make-foo () (list unique-id () () ()))

	  (defun foo-p (x) (and (listp x) (eq (car x) unique-id))))

	Specifically, you couldn't turn the defun of foo-p into the seemingly
	obvious defmacro.

    I think if you actually write out the seemingly obvious defmacro, you
    will see that it's not so:

	  (defmacro foo-p (x) `(and (listp ,x) (eq (car ,x) unique-id))))

    which does not reference unique-id as a variable from the body of
    the macro, only from the expansion of the macro.

',unique-id

    Of course the inline proclamation was made to order for this.  I wonder
    if it was intended to work for things not at top level.  This can of
    worms should not be dealt with piecemeal.

This can of worms includes storing FOOs in binary files.  The string
which is unique-id, by Gregor's intended semantics, must be the same
in all bin files that have their roots with the make-foo above, and the
loader somehow has to know all this.  It might work in a single file,
but to do multiple files starts getting into the realm of global unique
ids and databases and so on.