The basic data types available for the programmer are symbols, strings, lists, integers, and pointers to files and internal functions. Programmer has also a limited ability to define his/her own types in the 16-bit range. There is a flexible read-macro system and other mechanisms for customizing the symbolic I/O-system to get the desired effects. I have used it especially for the various text analysis and compiling experiments. A good example of the latter is GLAD, Generic Lisp-based Assembler-Disassembler, from which there is an implementation to assemble and disassemble PDP-11 machine code.
The size of the sources of this interpreter are approximately 10,000 lines of C plus about 1500 lines of Assembly code, adequately commented.
I designed and coded this software around the turn of the 90's, when I still had just two 360 KB floppy drives and 256 Kbytes of RAM in my basic 4.77 MHz PC, so I really paid special attention to the efficiency, both in terms of space and time.
Sometimes I still dream of porting this to the generic Unix environment, maybe also at the same time implementing the TCP/IP socket interface and I/O safe multithreading as to facilitate easy development of special Web-applications a la WWWGATE. (Read it if you have to, although it is full of truisms.)
Of course I should also implement many missing, essential things like garbage collection, floating points numbers, 32-bit integers, bignums, macros and let-forms (How about ODBC compliant or higher-level database access functions?), and probably I should tweak the overall system more towards some "standard", whether it is a reduced version of the Common Lisp, the old style Franz Lisp, or even Scheme.