(*
 * Defintion of a Lisp value datatype, which is one of t, nil, number, string,
 * symbolic atom, or (recursively) list.
 *)
datatype lispVal =
    T |			(* Lisp t as an ML enumeration literal *)
    NIL |		(* Lisp nil as an ML enumeration literal *)
    N of int |		(* Lisp number as an ML int (who cares about reals)*)
    S of string |	(* Lisp string as an ML string *)
    A of string |	(* Lisp symbolic atom as an ML string *)
    L of lispVal list;	(* Lisp list as an ML list *)

(*
 * Using this datatype, the following Lisp list
 *
 *     ( 10 20 'x "hi there" t 'y (30 40 50 (60 70)) nil 80 )
 *
 * is represented by the following ML value:
 *
 *)
        L[N(10), N(20), A("x"), S("hi there"), T, A("y"),
	   L[N(30), N(40), N(50), L[N(60), N(70)]], NIL, N(80)];
g