---------------------------------------- LITHP A small simple LISP interpreter Scott "Jerry" Lawrence 2001 October jsl@absynth.com http://www.cis.rit.edu/~jerry ---------------------------------------- OVERVIEW This is a basic, tiny LISP implementation. It was created to be a configuration/logic file format for a game I am working on. It is easily extendable enough to be used for other projects as well. This project is meant to be included within your own work. There is a sample executable that gets built that reads in from a file, and interprets it, but it is very easy to integrate this source into your own projects. It is also very easy to add your own methods into the evaluation core. ---------------------------------------- Supported Commands Misc: # # foo comment - skipped during parsing ; ; foo comment - skipped during parsing A (A) returns the value Variables, Functions: set (set A B ... ) sets A to B, evaluating both. Returns B. setf (setf A B ... ) sets A to B, evaluating only B. Returns B. setq (setq x 4 y 3) same as 'setf' defun (defun A B C) defines a function called A with parameter list B and code block C. Returns A. (A X Y) Calling the above (if there were two parameters.) Wrong number of parameters returns NIL w/o evaluating Numbers: + (+ A B C) add a list - (- A B C) subtract a list * (* A B C) multiply a list / (/ A B C) divide a list % (% A B) After A is divided by B, what's the leftover? 1+ (1+ A) returns the number plus one 1- (1- A) returns the number minus one Comparisons: < (< A B) returns T if A < B, otherwise NIL <= (<= A B) returns T if A <= B, otherwise NIL > (> A B) returns T if A > B, otherwise NIL >= (>= A B) returns T if A >= B, otherwise NIL = (= A B) returns T if A == B, otherwise NIL and (and A B) eval's the arguments until it hits a NIL or (or A B) eval's the arguments while args are NIL not (not A) returns the opposite of A (T->NIL),(NIL->T) null (null A) same as 'not' if (if A B C) if A is true, then B else C. if there's no C, return NIL unless (unless A B C) unless A is true, do B, C and any others. when (when A B C) when A is true, do B, C and any others. cond (cond (A B C)) if A is true then do B,C... otherwise, try the next set Evaluations: eval (eval (A B)) evaluates (A B) as if it were directly input prog1 (prog1 A B C) evaluates all parts, returns the first's return value prog2 (prog2 A B C) evaluates all parts, returns the second's return value progn (progn A B C) evaluates all parts, returns the last's return value Lists: quote quote (A B) returns the element instead of evaluating it ' '(A B) same as 'quote' atom (atom E) returns T if E evaluates to an atom, not a list equal (equal A B) returns T if A and B have the same structure and atoms car (car E) returns the head of list E cdr (cdr E) returns all but the head of list E cons (cons A B) returns a appended to the head of list B list (list A B) returns a list of the elements as passed in Output: princ (princ A B) print out the list entries and atoms terpri (terpri) print out a new line (terminate printing) ---------------------------------------- BUILD You should be able to just type 'make' or 'gmake' or whatever your GNU make is called. The Build process depends on: noweb literate programming toolset If you want the document, you also need: pdflatex latex To build the doc, type: make docs The build process will also generate a few sample LISP test files. ---------------------------------------- VERSION The latest version of this should be available off of http://www.cis.rit.edu/~jerry/Software/lithp Be sure you're using the latest version. ---------------------------------------- LICENSE This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA