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

Interaction between syntax-tables and environments

There's been a lot of Common Lisp mail recently about the optional
"environment" argument to MACROEXPAND and related functions, although
environments are not very well explained in the Common Lisp manual.  Of
course, I think T's notion of syntax tables is much cleaner, and I was
about to suggest that if they're going to make some changes, they might
do well to consider something like syntax tables.  But one nagging problem
we've faced in T is that there *is* an interaction between
macro-expanders and the environment, and it can cause trouble.  Short,
grotesque example:


(LET ((CAR CDR)) (KAR '(1 2 3))) => (2 3)

The person who defined KAR probably wanted the expanded code to use the
standard CAR, but because macros manipulate S-expressions and not values,
there's nothing to prevent the environment from thwarting his intentions.
Of course, you could write


but then you lose in efficiency, open-compilability, etc.  One way around
this is to extend the rules for evaluation to permit the CAR of a form
to be a procedure (as opposed to a symbol that is bound to a procedure).
(A similar thing is currently implemented for special forms.)  If this
were implemented, we could write


or, being very careful,


and avoid the problem.  This introduces other problems (e.g., external
representation, compiler), but it might be workable.

Comments?  Other suggestions?