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

Re: (declare (type fixnum ---)) considered etc.



    Date: Thu, 24 Jul 86  09:21:27 PDT
    From: Alan Snyder <snyder%hplsny@hplabs.HP.COM>

	From: Rob MacLachlan <RAM@C.CS.CMU.EDU>
	Subject: (declare (type fixnum ---)) considered etc.

	    Almost every other language in the entire world has a "INTEGER"
	type which has an ill-defined, fixed precision.  If Common Lisp is
	going to have comparable performance to these languages when running
	on the same hardware, then it is going to have to be comparably
	inelegant.

(signed-byte 69).  What's inefficient about that kind of construct.  The
problem with those other languages is that you CAN'T write realiable
portable code that is depending on those "integers"  In yonger days, I
would have wanted PDP-11 fortran to overflow "integers" into "bignums".
No such luck.  CL is considerably more powerful than those other
languages, and still provides the necessary constructs to give hints to
the compiler.  (signed-byte 12) is a perfectly valid thing.  It
CORRECTLY reflects the intent of the programmer, AND is portable.
FIXNUM does neither of these.

    Unfortunately, I must agree.  I think the PL/I experience shows
    that if you force people to declare the number of bits of
    precision they want, in most cases they will find out what number
    produces the best results on their current machine and use that,
    thus making their programs non-portable in terms of efficiency.
I pity the minds of those programmers.  If they are writing
system-dependent architecture-dependent code, fine.  If they are writing
portable code, they MUST declare their intents to get reasonable
efficiency from a variety of systems.
    There is no guarantee either that the maximum-array-bound
    corresponds to what we think of as FIXNUMs; why shouldn't a
    generous implementation allow BIGNUMs as array indexes?  There
    are, I admit, cases when the programmer knows how big integers
    will need to be, mostly when dealing with fixed-size arrays; in
    those cases, people who are concerned about efficiency should be
    encouraged to declare the exact range.  But, I don't think
    fixed-size arrays are a particularly good idea, either.  The
    conventional solution is to have one or more standard integer
    types with strongly suggested (required?) minimum precisions.  I
    think that is the right pragmatic solution to this problem, given
    the desire to produce efficient code on stock architectures.

If you really want to go least-common-denominator, you will probably
have to settle for 7 guarenteed bits, or maybe 8 or 9; I can't remember
how big MacLisp fixnums are.