http://t3x.org/lispxv/   (light|dark)

LISP XV

A Subset of LISP 1.5

lispxv.tgz (35KB, V03)  |  manual

LISP XV is a subset of the original 1960's LISP 1.5. If you ever wanted to play with the first widely used LISP without installing an IBM 7090 emulator, here is your chance.

LISP XV has been developed by studying the "LISP 1.5 Programmer's Manual" and testing the interpreter against the interpreter on a LISP 1.5 tape dated 1960-03-31 using Paul Pierce's excellent IBM 709x emulator.

There is a DOS COM file in the archive as well as the source code in T3X/0 and LISP.

What LISP XV does not emulate is the Flexowriter interface. The REPL provides a more modern interface with line editing. (I may (or may not) work on a Flexowriter emulation later.)

There are some other minor differences between LISP XV and LISP 1.5, but it should be close enough to get a feeling of what early LISP looked like. And it was different.

The REPL uses EVALQUOTE, so you type

CONS (FOO BAR)

instead of

(CONS (QUOTE FOO) (QUOTE BAR))

This is a great help, because 'X is not shorthand for (QUOTE X). You have to type QUOTE each time you want to quote something. Of course this also means that

CONS (FOO (CONS BAR NIL))

will give

(FOO CONS BAR NIL)

You will have to use EVAL in this case:

EVAL ((CONS (QUOTE FOO) (CONS (QUOTE BAR) NIL)) NIL)

And then LISP 1.5 also uses FEXPRs and FSUBRs instead of macros, so some functions may evaluate some of their arguments later and so, for example,

COND ((T FOO))

will not work. In this case you will have to use

COND ((T (QUOTE FOO)))

The quickest way to find out what a symbol is bound to?

EVAL (SYMBOL NIL)

Some functions of modern LISP will be there, many will not. Many will be different. ASSOC is called SASSOC and has a third argument to be used when the lookup fails. MAPLIST and MAPCON expect their list argument first. SETQ will not work with global variables. The only way to make loops run in constant space is the PROG facility.

Here is the MEMBER function in LISP 1.5:

DEFINE ((
  (MEMBER (LAMBDA (X A)
    (PROG ()
      NEXT (COND ((NULL A) (RETURN NIL)))
           (COND ((EQ X (CAR A)) (RETURN T)))
           (SETQ A (CDR A))
           (GO NEXT))))  ))

Yes, it just returns T instead of the tail of the list starting at the located element.

When something goes wrong, the system will spit out a two- or three-character error code. There is a list at the end of the manual.

When you are using modern LISP — like LISP 1.6 or MACLISP or anything later — this system will probably take some time to get used to. If you used LISP 1.5 on the Flexowriter, it may feel strangely familiar.

In any case — enjoy!


contact | privacy