[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[no subject]
- To: (BUG LISP) at MIT-MC, (BUG COMPLR) at MIT-MC
- From: KMP at MIT-MC (Kent M. Pitman)
- Date: Sun, 25 Jun 78 06:24:00 GMT
- Cc: NIL at MIT-MC, KMP at MIT-MC, JM at MIT-MC
- Original-date: 25 JUN 1978 0224-EDT
It strikes me that there should be a way in LISP to specify that a certain
value locally will be fixnum or flonum. The case arises in Fortran and all
sorts of crockish ways have been devised (and (sigh) are being used) to
conquer the problem. (ARRAYCALL FIXNUM N 5.) will declare locally that N
is a fixnum array -- this is not necessarily the case, but acts as a local
declaration to the compiler saying compile a fixnum call the the N array
anyway, and screw me if I am wrong. I don't have a similar mechanism however
that will cause an efficient compilation of: (LESSP (CAR A) 3.) since I can't
declare that (CAR A) is a fixnum. There are several alternatives:
[1] As JONL suggested, either by macro or explicitly I could use
(LESSP (+ (CAR A)) 3.) which will act as an explicit declaration
to the compiler that (CAR A) is fixnum. This is OK, but is an awfully
unclean way to go about it. I hope one of these other suggestions will
be taken in LISP and/or NIL.
[2] Create primitives of the form DECLARE-FIX, DECLARE-FLOAT, etc., which
would have the following effect -- in interpreted lisp they could be
either something trivial like (LAMBDA (X) X) or something more complex
that either did a (LHS X 0.) on it to actually change its type,
or did a (LAMBDA (X) (COND ((FIXP X) X) (T (ERR)))) to flag an error if
the thing was not the right type -- I am not really concerned with
what it does in the interpreter, but hopefully in the compiler
something like (LESSP (DECLARE-FIX (CAR A)) 3.) would be converted to
(< (CAR A) 3.)
[3] An alternative (probably too advanced for MacLISP but maybe not for NIL
is something JM brought up - LISP's big weakness is the locality of
structure - LIST's lose becuz they are assumed to be completely random
in content) would be to allow a declaration of the form
(DECLARE (LIST-STRUCTURE (A FIXNUM NOTYPE FIXNUM *)))
which would say that A is a list of first element fixnum, second
element NOTYPE, third elem FIXNUM, and some optional elements also
NO-TYPE following. If the * were omitted it would mean that
(LENGTH A) would be compilable as the constant 3, but could still be
referenced as (LENGTH A) in the code without loss of efficiency and
allowing the user to change his data easily by just modifying the
declaration.
Choice 2 I would like to see in MacLISP very soon if there are not too
many objections. It certainly wouldn't screw anyone's code and would be a
very nice feature for me. I would not object if it were even implemented
in the compiler as (DEFUN DECLARE-FIX MACRO (X) (LIST '+ (CADR X))) as
long as it was not me that had to guarantee its efficiency. For me to
be responsible for such a thing means that my software is relying upon
a given implementation of the compiler, etc., which I think is non-optimal.
Your opinions please? Thanx --kmp