Subject: Re: Why is Scheme not a Lisp?
From: Erik Naggum <erik@naggum.net>
Date: Sun, 17 Mar 2002 12:16:37 GMT
Newsgroups: comp.lang.lisp
Message-ID: <3225356208358354@naggum.net>

* Thomas Bushnell, BSG
| Um, no, nobody wants value lookups to be locked in at read time.  Except,
| that is, for the one case of "t" and "nil".  Those values *are* locked in
| at read time, by making those two symbols Very Special.

  Hey, dude, acquire clue, _then_ talk, will you?  Your ability to stop
  talking when your clue runs out is sorely lacking.  This indicates that
  you talk only to score rhetorical points for yourself, not to discuss
  anything of value to you or any others.  Please latch out of your hostile
  mode and start to think.  You used to be able to think, I remember.

  This is the real story: t and nil are declared constants, just like pi
  and most-positive-fixnum.  t and nil happen to have themselves as their
  constant value, but that is quite irrelevant to the binding issue.  This
  has nothing to do with the reader, either.  The standard says: The
  consequences of binding and assigning a constant variable are undefined.
  The value of a named constant may not be changed by assignment or
  binding.  So this has nothing to do with t or nil being special symbols,
  it has nothing to do with read-time, it has to do with the rules for
  binding and assigning constant variables.

  I wonder why you are not griping about pi, too.  Perhaps you are simply
  unaware of the idea of constant variables?  Does Scheme have constant
  variables?  No.  It has #f and #t, instead.  Does Scheme have a constant
  value for pi?  No.

  Now, it may illuminate the discussion to see why it is _necessary_ that
  constant variables not be rebound or assigned to.  First, there should be
  no need for a run-time lookup of their value -- the compiler should be
  free to inline the value.  Like, a test for nil-ness should be no more
  than a single instruction.  So if you change the value of a declared
  constant (it can be done), you get hosed by the system.  Second, to make
  a constant variable useful to programmers, they must know that they can
  rely on it.  This, somewhat ironically, follows from the _integrated_
  macro system in Common Lisp, and it would _not_ follow from the macro bag
  on the side of Scheme.  How do you capture the universal (stronger than
  global) value of a declared constant when you can shadow the binding and
  perhaps even make it lexical?  What would happen to macro bodies if you
  could change the value of t or nil?  Serious lossage!  To be able to rely
  on your Common Lisp environment, as in trust it, constants _must_ be
  known to have their one and only constant value.  This also means that if
  it is at all possible that it is not a constant and that you might want
  to re-bind the value, do not make it a constant.  Consequently, ther are
  few real constants around.  pi and e are the mathematical ones with their
  arbitrary names from a different domain, and t and nil are the boolean
  ones with their arbitrary names from the Common Lisp domain.  That is
  just how things are.  Deal with it.  Like it the way it is and spend your
  mental energy on solving your problems _with_ Common Lisp as a constant
  as far you are concerned.  This part of Common Lisp is not going to be
  changed.  However, if you really, really want to, you can do this:

(defpackage "LOSERVILLE"
  (:use "COMMON-LISP" ...)
  (:shadow "T"))

(defparameter t cl:t)

  so in Loserville, you may bind t, and most of the time, it will still
  work.  If you want it to work all the time, do not move to Loserville.

  The magnitude of the confusion and the absence of insight that must exist
  prior to making such an incredibly bogus claim as "Those values *are*
  locked in at read time, by making those two symbols Very Special" is just
  _staggering_.  The cluelessness that this betrays is so fantastically
  destructive to your credibility that it approaches the idiocy you keep
  committing when you post lies about what I would do just because you need
  to feed your psychotic imagination.  You know just about as much about
  Common Lisp as you do about me, and you have _no_ control over your
  blabbering.  It is _fantastically_ annoying to have people like you
  around.  Go away!

| That's the problem.  It's a teeny problem (and it wasn't I that brought
| it up), but it's a problem.  It's forced upon CL by compatibility
| considerations, and that's a perfectly good reason for CL to maintain the
| historic practice.  But it doesn't make the historic practice right.

  Do you have the mental capacity to back down when you are wrong?

///
-- 
  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.