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

NIL, experience with VAX-NIL, or NIL is nothing to worry about.



I was able to put a rational, i.e. (NOT (EQ 'NIL '())), scheme on
top of both VAX-NIL and LMI Release 2.0, both of which are common-lisp.
In fact, in the inner guts of VAX-NIL we have that () is not a symbol,
and the first distributed versions of NIL (SYMBOLP ()) => (),
but peer presure forced us (at that time Glenn Burke and myself) to
toe-the-line and change, if not the guts, but what the user sees
in the way of a type scheme. 

One argument TYPEP is not supported in common-lisp, so the following
output from VAX-NIL should not be suprising:
 (TYPEP ()) => NULL
 (TYPEP 'FOO) => SI:NON-NULL-SYMBOL
 (TYPEP '(FOO)) => SI:SIMPLE-CONS

Of course (SYMBOLP X) <==> (TYPEP X 'SYMBOL) 
   <==> (TYPEP X '(OR NULL SI:NON-NULL-SYMBOL)).
LISTP is then (TYPEP X '(OR NULL SI:SIMPLE-CONS SI:EXTENDED-CONS)).
The SI:EXTENDED-CONS is something GSB put in for BRANDX, (remember hunks?)
but lets not get into that.

There are of course special type masks cleverly arranged to be used with the
VAX instructions for doing these type unions, so that the most useful cases
of two-argument TYPEP are in-line-coded.

The inner workings of the microcoded lisps such as on the LMI LAMBDA
and TI EXPLORER play similar hacks with NIL. Its just one of those
things. Unfortunately the Common-Lisp committee, of which I felt like
an out-gunned member, had the "guts" to change MEMBER, ASSOC, EQUAL,
*, /, +,^, but not to address this NIL thing.

If you reread JAR's analysis, and I hope I have provided some hints
into the inner workings of some of the base lisps in question, then
you should see what he is talking about.