(SETQ FNS @(METEOR METRIX
                  METRIX2
                  COMITRULE
                  TRANSFER
                  DISPATCH
                  GTPAIR
                  FSTATM
                  SHELVE
                  SETDIS
                  GETDCT
                  INDIRECT
                  COMITR
                  COMITRIN
                  GTNAME
                  COPYTP
                  EXPAND
                  COMPRESS
                  MTREAD
                  ALL
                  NEXT
                  GTSHLF
                  SBMERGE
                  COMITMATCH
                  CMATCH
                  NAMER
                  SUBMCH
                  DOLNN
                  ADDLAST
                  WRITES
                  DEFLIST))

(DEFPROP METEOR
(LAMBDA (RULES WORKSPACE) (METRIX RULES WORKSPACE NIL NIL NIL))
EXPR)

(DEFPROP METRIX
(LAMBDA (RULES WORKSPACE SHELF DISPCH TRACK)
 (METRIX2 RULES WORKSPACE))
EXPR)

(DEFPROP METRIX2
(LAMBDA (RULES WORKSPACE)
 (PROG (PC GT A)
       (SETQ PC RULES)
  START(COND
        ((NULL PC)
         (RETURN (PROG2 (PRINT @(OVER END OF PROGRAM)) WORKSPACE))))
       (SETQ GT (DISPATCH (COMITRULE (CAR PC))))
       (COND ((EQ GT @*) (GO NEXT))
             ((EQ GT @END) (RETURN WORKSPACE))
             ((EQUAL GT (CAAR PC)) (GO START)))
       (SETQ A (TRANSFER GT RULES))
       (COND
        ((EQ (CAR A) @NONAME)
         (RETURN
          (PROG2
           (PRINT (LIST (CADR A) @(UNDEFINED GO-TO IN) (CAR PC)))
           WORKSPACE))))
       (SETQ PC A)
       (GO START)
  NEXT (SETQ PC (CDR PC))
       (GO START)))
EXPR)

(DEFPROP COMITRULE
(LAMBDA (RULE)
 (PROG (A B C D E G M LEFT)
       (SETQ G RULE)
  TOP  (SETQ RULE (CDR RULE))
       (SETQ A (CAR RULE))
       (SETQ E @*)
       (COND ((NOT (ATOM A)) (GO START))
             ((EQ A @*) (GO STAR))
             ((EQ A @*M) (GO *M))
             ((EQ A @*T) (GO *T))
             ((EQ A @*U) (GO *U)))
       (DEFLIST (CDR RULE) A)
       (RETURN @*)
  STAR (SETQ RULE (CDR RULE))
       (SETQ E (FSTATM RULE))
  START(COND ((AND (NULL TRACK) (NULL M)) (GO TRACK)))
       (PRINT @WORKSPACE)
       (PRINT WORKSPACE)
       (PRINT @RULE)
       (PRINT G)
  TRACK(SETQ LEFT (COMITMATCH (CAR RULE) WORKSPACE))
       (COND ((NULL LEFT) (RETURN E)))
  LOOP (SETQ RULE (CDR RULE))
       (SETQ A (CAR RULE))
       (COND ((NULL RULE) (RETURN E))
             ((EQ A @$) (GO DOLL))
             ((ZEROP A) (GO ON))
             ((ATOM A) (GO SW))
             ((EQ (CAR A) @\) (GO SHELVE)))
  ON   (SETQ WORKSPACE (COMITR LEFT A))
       (COND (M (PROG2 (PRINT @WORKSPACE) (PRINT WORKSPACE))))
       (GO LOOP)
  DOLL (SETQ A (CAR WORKSPACE))
  SW   (COND ((EQ E @*) (RETURN A)))
       (RETURN @*)
  SHELVE
       (SHELVE LEFT A)
       (GO LOOP)
  *M   (SETQ M A)
       (GO TOP)
  *T   (SETQ TRACK A)
       (GO TOP)
  *U   (SETQ TRACK NIL)
       (GO TOP)))
EXPR)

(DEFPROP TRANSFER
(LAMBDA (GT RL)
 (PROG NIL
  START(COND ((NULL RL) (RETURN (LIST @NONAME GT)))
             ((EQ GT (CAAR RL)) (RETURN RL)))
       (SETQ RL (CDR RL))
       (GO START)))
EXPR)

(DEFPROP DISPATCH
(LAMBDA (GT)
 (PROG (A)
       (COND ((EQ GT @*) (RETURN GT)))
       (SETQ A (GTPAIR GT DISPCH))
       (COND ((NULL A) (RETURN GT)))
       (RETURN (CAR A))))
EXPR)

(DEFPROP GTPAIR
(LAMBDA (NAME X)
 (PROG (A)
  START(COND ((NULL X) (RETURN NIL))
             ((EQUAL (CAR X) NAME) (RETURN (CDR X))))
       (SETQ X (CDDR X))
       (GO START)))
EXPR)

(DEFPROP FSTATM
(LAMBDA (RULE)
 (PROG (A)
  START(SETQ A (CAR RULE))
       (COND ((NULL RULE) (RETURN @*))
             ((ZEROP A) (GO ON))
             ((ATOM A) (RETURN A)))
  ON   (SETQ RULE (CDR RULE))
       (GO START)))
EXPR)

(DEFPROP SHELVE
(LAMBDA (PAIRS INST)
 (PROG (A B C D)
  START(SETQ INST (CDR INST))
       (COND ((NULL INST) (RETURN SHELF)))
       (SETQ A (CAR INST))
       (SETQ B (CAR A))
       (SETQ C (CADR A))
       (SETQ D (CDDR A))
       (COND ((EQ B @*P) (GO PR))
             ((EQ B @*D) (RETURN (SETDIS C (CAR D))))
             ((NEQ C @*) (GO GETD)))
       (SETQ C (INDIRECT (CAR D) PAIRS))
       (SETQ D (CDR D))
  GETD (SETQ D (COMITRIN PAIRS D))
       (SETQ A (GTSHLF C))
       (COND ((EQ B @*S) (GO ST1))
             ((EQ B @*Q) (GO QU1))
             ((EQ B @*X) (GO EX)))
       (PRINT (LIST @(SHELVING ERROR IN) (CAR INST)))
       (GO START)
  PR   (COND ((EQ C @\) (RETURN (PRINT SHELF))))
  PR1  (PRINT (LIST @SHELF C @CONTAINS (CAR (GTSHLF C))))
       (COND ((NULL D) (GO START)))
       (SETQ C (CAR D))
       (SETQ D (CDR D))
       (GO PR1)
  EX   (SETQ B (CAR A))
       (RPLACA A WORKSPACE)
       (SETQ WORKSPACE B)
       (GO START)
  QU1  (RPLACA A (COND ((CAR A) (NCONC (CAR A) D)) (D)))
       (GO START)
  ST1  (RPLACA A (APPEND D (CAR A)))
       (GO START)))
EXPR)

(DEFPROP SETDIS
(LAMBDA (X Y)
 (PROG (A)
       (SETQ A (GTPAIR X DISPCH))
       (COND ((NULL A) (SETQ DISPCH (CONS X (CONS Y DISPCH))))
             (T (RPLACA A Y)))
       (RETURN DISPCH)))
EXPR)

(DEFPROP GETDCT
(LAMBDA (X Y)
 (PROG (A)
       (COND ((NOT (ATOM X)) (RETURN (LIST X))))
       (SETQ A (GET X Y))
       (COND ((NULL A) (RETURN X)))
       (RETURN A)))
EXPR)

(DEFPROP INDIRECT
(LAMBDA (X PAIRS) (GTNAME X PAIRS))
EXPR)

(DEFPROP COMITR
(LAMBDA (LEFT ORDER)
 (PROG (A B C)
       (SETQ A (GTNAME 0 LEFT))
       (COND ((ZEROP A) (SETQ A NIL))
             ((NULL A) (GO ON))
             ((ATOM A) (SETQ A (LIST A))))
  ON   (SETQ B (GTNAME @WSEND LEFT))
       (COND ((ZEROP ORDER) (SETQ C NIL))
             (T (SETQ C (COMITRIN LEFT ORDER))))
       (RETURN (APPEND A C B))))
EXPR)

(DEFPROP COMITRIN
(LAMBDA (LEFT ORDER)
 (PROG (A B)
  START(COND ((NULL ORDER) (RETURN A)))
       (SETQ B (GTNAME (CAR ORDER) LEFT))
       (COND ((NULL B) (GO ON)) ((ATOM B) (SETQ B (LIST B))))
       (SETQ A (COND (A (NCONC A B)) (B)))
  ON   (SETQ ORDER (CDR ORDER))
       (GO START)))
EXPR)

(DEFPROP GTNAME
(LAMBDA (NAME PRS)
 (PROG (A B C)
       ((ATOM NAME) (GO START))
       (SETQ C (CAR NAME))
       (COND
        ((EQ C @FN)
         (RETURN
          (COPYTP
           (APPLY (CADR NAME) (COMITRIN PRS (CDDR NAME)) NIL))))
        ((EQ C @*K) (RETURN (LIST (COMITRIN PRS (CDR NAME)))))
        ((EQ C @*C) (RETURN (COMPRESS (COMITRIN PRS (CDR NAME)))))
        ((EQ C @*) (RETURN (COPYTP (EVAL (CADR NAME)))))
        ((EQ C @*W) (RETURN (WRITES (COMITRIN PRS (CDR NAME)))))
        ((EQ C @*E) (RETURN (EXPAND (GTNAME (CADR NAME) PRS))))
        ((EQ C @*\) (RETURN (LIST (SBMERGE (CDR NAME)))))
        ((EQ C @*N) (RETURN (NEXT (CDR NAME))))
        ((EQ C @*R) (RETURN (MTREAD)))
        ((EQ (CADR NAME) @\)
         (RETURN
          (LIST
           (SBMERGE (LIST @MERGE C (CONS @G99999 (CDR NAME)))))))
        ((EQ C @*F) (RETURN (CAAR (GTNAME (CADR NAME) PRS))))
        ((EQ C @*A) (RETURN (ALL (CDR NAME))))
        ((EQ C QUOTE) (RETURN (CADR NAME))))
  START(COND ((NULL PRS) (RETURN NAME)))
       (SETQ A (CAR PRS))
       (COND ((EQUAL NAME (CAR A)) (RETURN (COPYTP (CDR A)))))
       (SETQ PRS (CDR PRS))
       (GO START)))
EXPR)

(DEFPROP COPYTP
(LAMBDA (X) (COND ((ATOM X) X) ((APPEND X NIL))))
EXPR)

(DEFPROP EXPAND
(LAMBDA (X) (COND ((ATOM X) (EXPLODE X)) ((CAR X))))
EXPR)

(DEFPROP COMPRESS
(LAMBDA (X) (READLIST X))
EXPR)

(DEFPROP MTREAD
(LAMBDA NIL
 (PROG (A B)
       (CLRBFI)
       (SETQ A (NCONS))
  A    (SETQ B (READCH))
       ((EQ (CHRVAL B) 15) (RETURN (VCONC A)))
       (TCONC A B)
       (GO A)))
EXPR)

(DEFPROP ALL
(LAMBDA (X)
 (PROG (A B)
       (COND ((EQ (CAR X) @*) (SETQ X (INDIRECT (CADR X) PRS)))
             (T (SETQ X (CAR X))))
       (SETQ A (GTSHLF X))
       (SETQ B (CAR A))
       (RPLACA A NIL)
       (RETURN B)))
EXPR)

(DEFPROP NEXT
(LAMBDA (X)
 (PROG (A B C)
       (COND ((EQ (CAR X) @*) (SETQ X (INDIRECT (CADR X) PRS)))
             (T (SETQ X (CAR X))))
       (SETQ A (GTSHLF X))
       (SETQ C (CAR A))
       (COND ((NULL C) (RETURN NIL)))
       (SETQ B (CAR C))
       (RPLACA A (CDR C))
       (RETURN (LIST B))))
EXPR)

(DEFPROP GTSHLF
(LAMBDA (X)
 (PROG (A)
       (SETQ A (GTPAIR X SHELF))
       (COND ((NULL A) (GO A)))
       (RETURN A)
  A    (SETQ A (CONS NIL SHELF))
       (SETQ SHELF (CONS X A))
       (RETURN A)))
EXPR)

(DEFPROP SBMERGE
(LAMBDA (X)
 (PROG (A B C D E G)
       (SETQ A (CAR X))
       (SETQ B (CADR X))
       (COND ((EQ (AND (CONSP B) (CADR B)) @\) (GO BX)))
       (SETQ B (GTNAME B PRS))
       (COND ((NOT (ATOM B)) (SETQ B (CAR B))))
  BX   (SETQ C (CADDR X))
       (COND ((EQ (CADR C) @\) (GO CX)))
       (SETQ C (GTNAME C PRS))
       (COND ((NOT (ATOM X)) (SETQ C (CAR C))))
  CX   (COND ((OR (ATOM C) (NOT (EQ (CADR C) @\))) (SETQ C NIL))
             (T (SETQ C (CDDR C))))
       (COND ((OR (ATOM B) (NOT (EQ (CADR B) @\))) (GO B)))
       (SETQ D (LIST (CAR B) @\))
       (SETQ B (CDDR B))
       (GO D)
  B    (SETQ D (LIST B @\))
       (SETQ B NIL)
  D    (SELECTQ A
                (AND (GO AND))
                (MERGE (GO AND))
                (OR (GO OR))
                (SUBST (GO SUBST))
                NIL)
  ERROR(PRINT @(SUBSCRIPT ERROR))
       (PRINT X)
       (RETURN (GTNAME (CADR X) PRS))
  AND  (COND ((NULL B) (GO RETURN))
             ((MEMBER (CAR B) C) (SETQ G (CONS (CAR B) G))))
       (SETQ B (CDR B))
       (GO AND)
  OR   (SETQ G C)
  OR1  (COND ((NULL B) (GO RETURN))
             ((NOT (MEMBER (CAR B) G)) (SETQ G (CONS (CAR B) G))))
       (SETQ B (CDR B))
       (GO OR1)
  SUBST(SETQ G C)
  RETURN
       (COND ((AND (EQ A @MERGE) (NULL G)) (SSETQ G C)))
       (COND ((NULL G) (RETURN (CAR D))))
       (RETURN (NCONC D G))))
EXPR)

(DEFPROP COMITMATCH
(LAMBDA (RULE WORKSPACE)
 (PROG (A B)
       (SETQ A (CMATCH (NAMER RULE) WORKSPACE NIL))
       (COND ((NULL A) (RETURN NIL)) ((EQ A @$IMP) (RETURN NIL)))
       (SETQ B (CONS @WSEND (CDR A)))
       (RETURN (ADDLAST (CAR A) B))))
EXPR)

(DEFPROP CMATCH
(LAMBDA (RULE WORKSPACE MPAIRS)
 (PROG (RNAME A B C D E G H)
       (SETQ RNAME (CAR RULE))
       (SETQ RULE (CDR RULE))
       (SETQ B (CAR RULE))
       (COND ((NULL RULE) (RETURN (CONS MPAIRS WORKSPACE)))
             ((EQ B @$0) (GO $0))
             ((EQ B @$) (GO PDOLL)))
       (SETQ H (AND (CONSP B) (CAR B)))
       (COND ((EQ H @*P) (GO PRINT))
             ((EQ H @FN) (GO FN))
             ((NULL WORKSPACE) (RETURN @$IMP)))
       (SETQ G 0)
       (COND ((EQ B @$1) (SETQ G 1))
             ((EQ B @$2) (SETQ G 2))
             ((EQ B @$3) (SETQ G 3)))
       (COND ((NOT (ZEROP G)) (GO NDOLL2)))
       (GO TEST)
  $0   (COND
        ((AND (NOT (NULL WORKSPACE)) (NULL (CDR RULE))) (SETQ B NIL))
        (T (SETQ B (CONS NIL WORKSPACE))))
       (GO WATB)
  TEST (COND ((EQ H @$) (GO NDOLL))
             ((EQ H @*) (GO EVAL))
             ((EQ H QUOTE) (GO ATB1))
             (T (GO ATB)))
  FN   (SETQ B (CDR B))
       (SETQ E (CONS WORKSPACE (COMITRIN MPAIRS (CDR B))))
       (SETQ B (COPYTP (APPLY (CAR B) E NIL)))
  WATB (COND
        ((NULL B) (RETURN NIL))
        ((EQ B @$IMP) (RETURN B))
        (T
         (RETURN
          (CMATCH (CONS (CDR RNAME) (CDR RULE))
                  (CDR B)
                  (ADDLAST MPAIRS (CONS (CAR RNAME) (CAR B)))))))
  PDOLL(SETQ D (CDR RNAME))
       (SETQ RULE (CDR RULE))
       (COND
        ((NULL RULE)
         (RETURN
          (LIST (ADDLAST MPAIRS (CONS (CAR RNAME) WORKSPACE))))))
  DLOOP(SETQ B (CMATCH (CONS D RULE) WORKSPACE MPAIRS))
       (COND
        ((NULL WORKSPACE) (RETURN NIL))
        ((EQ B @$IMP) (RETURN B))
        (B
         (RETURN
          (CONS (ADDLAST (CAR B) (CONS (CAR RNAME) C)) (CDR B)))))
       (SETQ C (ADDLAST C (CAR WORKSPACE)))
       (SETQ WORKSPACE (CDR WORKSPACE))
       (GO DLOOP)
  SUBMCH
       (SETQ B (SUBMCH B WORKSPACE))
       (GO WATB)
  PRINT(PRINT (CDR B))
       (PRINT WORKSPACE)
  $IMP (RETURN @$IMP)
  EVAL (SETQ B (EVAL (CADR B)))
       (GO ATB2)
  ATB1 (SETQ B (CADR B))
       (GO ATB2)
  ATB  (COND ((ATOM B) (SETQ B (GTNAME B MPAIRS))))
  ATB2 (SETQ H (CAR WORKSPACE))
       (COND ((ATOM B) (GO B))
             ((EQ (CADR B) @\) (GO SUBMCH))
             ((EQUAL B H) (SETQ B (CONS (LIST B) (CDR WORKSPACE))))
             (T (SETQ B NIL)))
       (GO WATB)
  B    (COND
        ((EQUAL B H) (SETQ B WORKSPACE))
        ((AND (EQUAL B (AND (CONSP H) (CAR H))) (EQ (CADR H) @\))
         (SETQ B (CONS (LIST H) (CDR WORKSPACE))))
        (T (SETQ B NIL)))
       (GO WATB)
  NDOLL(SETQ G (CADR B))
  NDOLL2
       (SETQ B (DOLNN G WORKSPACE))
       (GO WATB)))
EXPR)

(DEFPROP NAMER
(LAMBDA (X)
 (PROG (A B C D E)
       (SETQ A (CAR X))
       (SETQ D 1)
       (SETQ B X)
       (COND ((OR (EQ A @$) (EQ A @$0)) (GO START)))
       (SETQ B (CONS @$ X))
       (SETQ E (LIST 0))
  START(COND ((NULL X) (RETURN (CONS E B))))
       (SETQ E (ADDLAST E D))
       (SETQ X (CDR X))
       (SETQ D (ADD1 D))
       (GO START)))
EXPR)

(DEFPROP SUBMCH
(LAMBDA (X Y)
 (PROG (A B C)
       (SETQ A (CAR X))
       (SETQ B (CAR Y))
       (COND
        ((NOT
          (OR (EQ A @$1)
              (EQUAL A (AND (CONSP B) (CAR B)))
              (EQUAL A @($ 1))))
         (RETURN NIL)))
       (COND ((EQ (CADR B) @\) (GO ON)) (T (RETURN NIL)))
  ON   (SETQ A (CDR X))
       (COND ((EQ (CAR A) @\) (GO A)))
       (PRINT (LIST @(SUBSCRIPT ERROR SUBMCH) X))
       (RETURN NIL)
  A    (SETQ A (CDR A))
       (SETQ C (CDDR B))
  START(COND ((NULL A) (RETURN (CONS (LIST B) (CDR Y))))
             ((MEMBER (CAR A) C) (SETQ A (CDR A)))
             (T (RETURN NIL)))
       (GO START)))
EXPR)

(DEFPROP DOLNN
(LAMBDA (NUM WSPACE)
 (PROG (A B)
       (SETQ B (CAR WSPACE))
       (COND ((NUMBERP NUM) (GO NUM))
             ((EQ NUM @NUMBER) (GO NUMBER))
             ((EQ NUM ATOM) (GO ATOM))
             ((EQ NUM LIST) (GO LIST)))
       (COND ((OR (EQUAL NUM B) (EQUAL NUM (CAR B))) (GO RNIL)))
  $1   (COND ((ATOM B) (GO B)))
  LST  (RETURN (CONS (LIST B) (CDR WSPACE)))
  NUMBER
       (COND ((NOT (NUMBERP B)) (GO RNIL)))
  B    (RETURN WSPACE)
  ATOM (COND ((ATOM B) (GO B)))
  RNIL (RETURN NIL)
  LIST (COND ((ATOM B) (GO RNIL)) (T (GO LST)))
  NUM  (COND ((ONEP NUM) (GO $1)))
  START(COND ((ZEROP NUM) (RETURN (CONS A WSPACE)))
             ((NULL WSPACE) (RETURN @$IMP)))
       (SETQ A (ADDLAST A (CAR WSPACE)))
       (SETQ WSPACE (CDR WSPACE))
       (SETQ NUM (SUB1 NUM))
       (GO START)))
EXPR)

(DEFPROP ADDLAST
(LAMBDA (X Y) (APPEND X (LIST Y)))
EXPR)

(DEFPROP WRITES
(LAMBDA (X)
 (PROG (A)
  START(SETQ A (CAR X))
       (COND ((NULL X) (RETURN NIL))
             ((EQ A @$EOR$) (GO ON))
             ((ATOM A) (PRIN1 A))
             (T (PRIN1 @***)))
       (SETQ X (CDR X))
       (GO START)
  ON   (TERPRI)
       (RETURN NIL)))
EXPR)

(DEFPROP DEFLIST
(LAMBDA (%A %B)
 (MAPCAR @(LAMBDA (X) (PUTPROP (CAR X) (CADR X) B) (RETURN (CAR X)))
         A))
EXPR)


(SETQ TESTS @(WS123 TEST1
                   TEST2
                   TEST3
                   WS4
                   TEST4
                   WS5
                   TEST5
                   WS6
                   TEST6
                   WS7
                   TEST7
                   WS8
                   TEST8))

(SETQ WS123 @(A ROSE IS A ROSE IS A ROSE))

(SETQ TEST1 @((* (ROSE) (FLOWER) * (SIMPLE REPLACEMENT))
             (* ((*P THE WORKSPACE IS)) * (DEBUG PRINTOUT))
             (* (IS A ROSE) 0 * (DELETION))
             (* (A FLOWER IS) (3 1 2) * (REARRANGEMENT))
             (* ((*P WS2)) *)
             (* (FLOWER) (1 OF RED) * (INSERTION))
             (* (A FLOWER) (THE 2) * (REPLACEMENT IN CONTEXT))
             (* ((*P WS3)) *)
             (* (FLOWER) * (NO OPERATION))
             (* (RED) (1 1) * (DUPLICATION))
             (* ((*P WS4)) *)
             (* (OF ($ 1)) (1) * (SINGLE UNKNOWN CONSTITUENT))
             (* (($ 1)) (QUESTION 1) * (FIRST CONSTITUENT))
             (* ((*P WS5)) *)
             (* (($ 2) FLOWER ($ 3))
                (3 2 1)
                *
                (N CONSECUTIVE CONSTITUENTS))
             (* ((*P WS6)) *)
             (* (FLOWER $ ROSE) (1 3) * (UNKNOW NUM OF CONSTITUENTS))
             (* ((*P WS7)) *)
             (* ($) (START C A B D) * (REPLACING ENTIRE WORKSPACE))
             (* (START ($ 1) $ D) (1 3 2 4) *)
             (* ((*P WS8)) *)
             (* ($) END)))

(SETQ TEST2 @((CHANGE (A ROSE) (THE FLOWER) CHANGE (FLOW OF CONTROL))
             (RULE1 (FLOWER) RULE3)
             (RULE2 * ((*P WSP)) END)
             (RULE3 (ROSE) CHANGE)
             (* * (ROSE) (FLOWER) RULE2)
             (* * ((*P WSEND)) END)))

(SETQ TEST3 @((CHANGE ($ ROSE)
                     (FLOWER)
                     (\ (*Q SHELF1 1 PRETTY))
                     CHANGE)
             (* ($) ((*A SHELF1) 1) (\ (*D PNTRET RULE3)) *)
             (PRNTWS * ((*P THE WORKSPACE IS)) PNTRET)
             (RULE2 ($) END)
             (RULE3 (($ 1) ($ 1))
                    0
                    (\ (*S ODD 1) (*Q EVEN 2) (*D PNTRET RULE3))
                    PRNTWS)
             (*
              ($)
              ((*A ODD) (*N EVEN))
              (\ (*Q ODD (*N EVEN) ONLY)
                 (*P ODD EVEN)
                 (*D PNTRET RULE2))
              PRNTWS)))

(SETQ WS4 @((1) H1 H2 H3 H4 C1 C2 C3 C4 D1 D2 D3 D4 S1 S2 S3 S4))

(SETQ TEST4 @((DEAL
              ($1 $1)
              ((FN (LAMBDA (X) (NCONS (NCONS (ADD1 (CAR X))))) 1))
              (\ (*S * 1 2))
              *)
             (* * ($2) PRINT)
             (* ((5)) (@((1))) DEAL)
             (* ($) DEAL)
             (PRINT ($) (\ (*P \)) END)))

(SETQ WS5 @(THE BOY AND GIRL))

(SETQ TEST5 @((* DICT
                (BOY ((BOY \ NOUN HE)))
                (GIRL ((GIRL \ NOUN SHE))))
             (LOOKUP ($1)
                     0
                     (\ (*Q SENT (FN GETDCT 1 DICT)) (*P SENT))
                     LOOKUP)
             (* ($) ((*A SENT)) END)))

(SETQ WS6 @(THE (BOY \ NOUN SING SMALL) AT HOME))

(SETQ TEST6 @((*
              ((BOY \ NOUN SING))
              ((*\ AND 1 (DOG \ NOUN MALE))
               (*\ OR 1 (BOY \ SMALL MALE))
               (*\ SUBST 1 (MAN \ MALE)))
              END)))

(SETQ WS7 @(WHO IT IS AT MY DOOR IS THERE NOW))

(SETQ TEST7 @((* (($ 1) IS ($ 2) $ THERE) ((*K 1 2 3 4)) END)))

(SETQ WS8 @(IS (ANYBODY AT HOME) NOW))

(SETQ TEST8 @((* (IS ($ 1)) (1 (*E 2)) END)))