Subject: Re: Why is Scheme not a Lisp?
From: Erik Naggum <erik@naggum.net>
Date: Sat, 16 Mar 2002 02:59:30 GMT
Newsgroups: comp.lang.lisp
Message-ID: <3225236382019921@naggum.net>

* Thomas Bushnell, BSG
| But then that means that CL macros are not hygenic, because FLET captures
| bindings in exactly the ways that are the point behind hygenic macros.
| 
| Erik said if you separate function and variable namespaces, then you
| don't need hygenic macros.

  No, I said quite a bit more than that.  Separating function and variable
  values is a necessary condition, not a sufficient condition to not need
  hygienic macros.  Please return to the textbooks of whatever introductory
  course at your university or high school deals with argumentation and
  logic and LOOK UP THE DIFFERENCE BETWEEN NECESSARY AND SUFFICIENT,
  because you have truly not understood this and repeatedly make the
  mistake of conflating them.

  I recommend a book I came across by accident 12 years ago: The Art of
  Reasoning by David Kelley.  I have the first hardcover edition from 1988,
  but I see there is a third edition out in paperback:

http://www.amazon.com/exec/obidos/ASIN/0393972135

  There are probably lots and lots of books about thinking, but most of
  them seem to start with the assumption that you cannot think and thus
  have to learn it.  This book starts with assumption that you can think,
  you only need to train yourself and stay away from the mistakes.
  Thinking is an acquired skill, but most people have somehow gotten by.
  There is some value to not ignoring that fact.  However, many academics
  seem to have lost the ability to think clearly somewhere on the way to
  become extremely specialized in some arbitrarily complex field and they
  have certainly been rewarded with a highly characterized version of real
  thinking skills that is more about not feeling than about thinking.

| That's true only because
| 
| 1) Global definitions are almost always functions.
| 2) Global data definitions have special names, by convention , and
|    people never shadow those.
| 3) People don't make local bindings in the function namespace.
| 
| It's right that Lisp2 doesn't force you to follow those rules, but if you
| don't follow them, then you can't claim that CL macros are hygenic.

  Excuse me for knowing the Common Lisp language so well that I tend to
  forget that there are people out there with a strong desire _not_ to
  learn it before they shoot their mouths off.  Now is a good tiem for you
  to wonder what it means that I also talked about packages and try to
  figure out what a Common Lisp programmer must know in order to use his
  language.  In particular, a Common Lisp programmer has either read and
  understood 11.1.2.1.2 in the standard, or he has an implementation of
  Common Lisp (or a teacher) that enforces it.  In either case, he learns
  that he can trust that if he sees a function call to common-lisp:car, he
  _knows_ what it will do, with absolute certainty -- no need to check the
  lexical environment, no need to afraid someone clobbered it, no need to
  scrub off the non-hygienic crap that Scheme accretes because it has no
  package concept _and_ no distinction between functional and variable
  values so all the good variables names are taken.

  The reason Scheme needs hygienic macros is the same as the reason Scheme
  programmers do not call their arguments "list", but "lst".  We do not
  have _that_ problem in Common Lisp, either.  In short, Common Lisp is
  already a clean language, it does not need hygiene to clean up after its
  design decisions.

///
-- 
  In a fight against something, the fight has value, victory has none.
  In a fight for something, the fight is a loss, victory merely relief.