perm filename MATCH.CRM[PAT,LMM]1 blob
sn#044103 filedate 1973-05-18 generic text, type T, neo UTF8
␈↓ ↓⊗␈↓ εK EXPR]
␈↓ ↓⊗␈↓α(FILECREATED "18-MAY-73 4:42:12" MATCH.NEW)␈↓↓
␈↓ εK (SETQ EXPRESSION ('MATCH VAR PAT))
␈↓ ↓⊗
␈↓ εK (AND MUSTRETURN (SETQ POSTPONEDEFFECTS (NCONC1
␈↓ ↓⊗
␈↓ εK POSTPONEDEFFECTS
␈↓ ↓⊗ (LISPXPRINT (QUOTE MATCHVARS)
␈↓ εK MUSTRETURN)))
␈↓ ↓⊗ T)
␈↓ εK [AND POSTPONEDEFFECTS (SETQ EXPRESSION
␈↓ ↓⊗ (RPAQQ MATCHVARS
␈↓ εK ('AND EXPRESSION (COND
␈↓ ↓⊗ ((FNS MAKEMATCH 'MATCHTOP 'MATCH 'MATCHBIND 'MATCHELT
␈↓ εK ((CDR POSTPONEDEFFECTS)
␈↓ ↓⊗ 'MATCHEXP 'MATCHFIXED 'MATCHSUBPAT 'MATCHTAIL 'MATCHSOME
␈↓ εK (CONS (QUOTE PROGN)
␈↓ ↓⊗ 'MATCHWITHMEMB 'MATCHNNIL 'MATCHEXP1 LOCALPATVAR
␈↓ εK POSTPONEDEFFECTS))
␈↓ ↓⊗ 'MATCH&SET 'CDRLEN POSTPONE 'HEADP ABP RPLNODE)
␈↓ εK (T (CAR POSTPONEDEFFECTS]
␈↓ ↓⊗ (FNS ANALPATELT ANALPAT MAXANAL ANAL!PAT $? SKIP$I SKIP$
␈↓ εK (RETURN (COND
␈↓ ↓⊗ SKIP$ANY ELT? MEMBPAT? ARB? NOMATCHARB? NOMATCHELT?
␈↓ εK (BINDINGS (LIST (QUOTE PROG)
␈↓ ↓⊗ SUBPAT? NOMATCHARBCAR? NULLPAT? CANMATCHNIL)
␈↓ εK BINDINGS EXPRESSION))
␈↓ ↓⊗ (FNS EASYTORECOMPUTE EQTOMEMB FULLEXPANSION GENSYML MAKESUBST
␈↓ εK (T EXPRESSION])
␈↓ ↓⊗ MAKESUBST1 FORMEXPAND BIND BOUNDVAR RECOMPUTATION
␈↓ εK
␈↓ ↓⊗ MAKEVAR)
␈↓ εK␈↓α('MATCH␈↓↓
␈↓ ↓⊗ (FNS 'NLEFT 'NOT 'NOTLESSPLENGTH 'NTH 'NTH{NUMBER⎇ 'OR 'PLUS
␈↓ εK [LAMBDA (VAR PAT) (* Constructs match of
␈↓ ↓⊗ 'REPLACE 'SETQ←SIDE←EFFECT 'REPLACE←SIDE←EFFECT 'SETQ
␈↓ εK PAT against VAR -
␈↓ ↓⊗ 'SETVAR 'SOME 'AND '!AND OPTIMIZEAND 'CAR 'CDR 'EQ
␈↓ εK See 'MATCHTOP for global
␈↓ ↓⊗ 'EQLENGTH 'EQUAL 'LENGTH 'LISTP 'NULL 'LAST 'TAILP
␈↓ εK vars)
␈↓ ↓⊗ 'LDIFF 'RETURN)
␈↓ εK (PROG (TAIL (LEN 0))
␈↓ ↓⊗ (FNS PARSE PATPARSE NUMPATPARSE PATPARSE1 PATPARSE← BI12
␈↓ εK (COND
␈↓ ↓⊗ PATPARSEAT PACKLDIFF BISET BIRPLAC MAKEDEFAULT
␈↓ εK ((NULL PAT)
␈↓ ↓⊗ MAKE!DEFAULT)
␈↓ εK ('EQLENGTH VAR 0))
␈↓ ↓⊗ (FNS HEADP)
␈↓ εK ((NLISTP PAT)
␈↓ ↓⊗ (VARS POSTPONE←SIDE←EFFECTS VARDEFAULT LISTPCHK ORSETQFLG)
␈↓ εK (HELP "BAD PARSING - NLISTP PAT IN 'MATCH" PAT))
␈↓ ↓⊗ (BLOCKS * MATCHBLOCKS)
␈↓ εK ((NULL (SETQ TAIL (SKIP$I PAT)))
␈↓ ↓⊗ (PROP MACRO EVERY SOME)))
␈↓ εK
␈↓ ↓⊗␈↓α(DEFINEQ␈↓↓
␈↓ εK (* PAT is a list of $i's -
␈↓ ↓⊗
␈↓ εK SKIP$I returns the first tail after all $i's, sets
␈↓ ↓⊗␈↓α(MAKEMATCH␈↓↓
␈↓ εK the variable LEN to the length of the $i's)
␈↓ ↓⊗ [LAMBDA (VAR TOPPAT)
␈↓ εK
␈↓ ↓⊗ ('MATCHTOP VAR (PATPARSE (COPY TOPPAT])
␈↓ εK
␈↓ ↓⊗
␈↓ εK ('EQLENGTH VAR LEN))
␈↓ ↓⊗␈↓α('MATCHTOP␈↓↓
␈↓ εK ((NULLPAT? TAIL) (* PAT is a list of $i's
␈↓ ↓⊗ [LAMBDA (EXPR PAT MUSTBEMATCH)
␈↓ εK followed by a $)
␈↓ ↓⊗
␈↓ εK ('NOTLESSPLENGTH VAR LEN))
␈↓ ↓⊗ (* Generate expresion which will match PAT against
␈↓ εK [(NOT (ZEROP LEN))
␈↓ ↓⊗ VAR -
␈↓ εK
␈↓ ↓⊗ MUSTBEMATCH is a flag which says if the value of the
␈↓ εK (* PAT starts with a list of $i's -
␈↓ ↓⊗ expression must be NIL if no match occurs and non
␈↓ εK 'MATCHEXP is called here instead of 'MATCH because
␈↓ ↓⊗ NIL otherwise -
␈↓ εK the 'NTH expression might not be EASYTORECOMPUTE)
␈↓ ↓⊗ ORSETQFLG is flag for setting whether setqs that
␈↓ εK
␈↓ ↓⊗ might be NIL should be embedded in
␈↓ εK
␈↓ ↓⊗ (OR (SETQ --) T) -
␈↓ εK (COND
␈↓ ↓⊗ NULLCHK is flag for setting whether there is an
␈↓ εK ((NUMBERP LEN)
␈↓ ↓⊗ implicit -- at the end of each pattern -
␈↓ εK ('MATCH ('NTH{NUMBER⎇ VAR (ADD1 LEN))
␈↓ ↓⊗ LISTPCHK is flag for whether sub-patterns should
␈↓ εK TAIL))
␈↓ ↓⊗ check LISTP first -
␈↓ εK (T ('MATCHEXP ('NTH VAR ('PLUS 1 LEN))
␈↓ ↓⊗ VARDEFAULT is flag which says what the default
␈↓ εK TAIL]
␈↓ ↓⊗ meaning of a variable in a pattern is
␈↓ εK [(ELT? (CAR PAT))
␈↓ ↓⊗ (either set for (... Var←$1 ...) or QUOTE for
␈↓ εK (COND
␈↓ ↓⊗ (... 'var ...) or equal for
␈↓ εK ((NULLPAT? (CDR PAT))
␈↓ ↓⊗ (... =VAR ...)) -
␈↓ εK ('MATCHELT ('CAR VAR)
␈↓ ↓⊗ POSTPONE←SIDE←EFFECTS is a flag which says whether
␈↓ εK (CAR PAT)
␈↓ ↓⊗ side effects (... pat←expr ...) or
␈↓ εK MUSTBEMATCH))
␈↓ ↓⊗ (... var←pat ...) should be postponed and only done
␈↓ εK (T ('AND ('MATCHELT ('CAR VAR)
␈↓ ↓⊗ if the entire pattern matches)
␈↓ εK (CAR PAT)
␈↓ ↓⊗
␈↓ εK T NIL)
␈↓ ↓⊗
␈↓ εK ('MATCH ('CDR VAR)
␈↓ ↓⊗ (PROG (POSTPONEDEFFECTS SOMEVARS EXPRESSION BINDINGS VAR
␈↓ εK (CDR PAT]
␈↓ ↓⊗ (GENSYMVARLIST (QUOTE (NIL $$1 $$2 $$3 $$4
␈↓ εK (($? (CAR PAT))
␈↓ ↓⊗ $$5 $$6 $$7 $$8
␈↓ εK ('MATCHTAIL VAR (CDR PAT)))
␈↓ ↓⊗ $$9 $$10 $$11
␈↓ εK ((NLISTP (CAR PAT))
␈↓ ↓⊗ $$12 $$13 $$14
␈↓ εK (HELP (QUOTE "BAD PATTERN ELEMENT")
␈↓ ↓⊗ $$15 $$16 $$17)))
␈↓ εK PAT))
␈↓ ↓⊗ (EASYFNS (QUOTE (CAR CDR)))
␈↓ εK ((NLISTP (CAAR PAT))
␈↓ ↓⊗ (MUSTBEMATCH T)
␈↓ εK (SELECTQ
␈↓ ↓⊗ (NULLCHK T)
␈↓ εK (CAAR PAT)
␈↓ ↓⊗ (MUSTRETURN T))
␈↓ εK [← (* Only segment SETS get
␈↓ ↓⊗ [COND
␈↓ εK here)
␈↓ ↓⊗ ((EASYTORECOMPUTE EXPR)
␈↓ εK (COND
␈↓ ↓⊗ (SETQ VAR EXPR))
␈↓ εK ((NULL (CDR PAT)) (* Call 'MATCHBIND to
␈↓ ↓⊗ (T (BIND (LIST (SETQ VAR (GENSYML EXPR))
␈↓ εK rebind MUSTBEMATCH)
␈↓ ↓⊗ ('AND ('MATCHBIND VAR (LIST (CDDR (CAR PAT)))
␈↓ εK ('MATCHELT VAR (CDR (CAR PAT))
␈↓ ↓⊗ T NIL)
␈↓ εK MUSTBEMATCH))
␈↓ ↓⊗ ('SETQ←SIDE←EFFECT
␈↓ εK [(SUBPAT? (CDAR PAT))
␈↓ ↓⊗ (CADR (CAR PAT))
␈↓ εK
␈↓ ↓⊗ VAR ORSETQFLG)))
␈↓ εK (* (..1.. ! (..2..) ..3..) is the same as
␈↓ ↓⊗ [(OR (ARB? (CDDAR PAT))
␈↓ εK (..1.. ..2.. ..3..))
␈↓ ↓⊗ (AND (NOT (ELT? (CDDAR PAT)))
␈↓ εK
␈↓ ↓⊗ (HELP
␈↓ εK
␈↓ ↓⊗ "I'LL TRY TO DO THIS MATCH IF YOU RETURN T" PAT)
␈↓ εK ('MATCH VAR (NCONC (CDAR PAT)
␈↓ ↓⊗ ))
␈↓ εK (CDR PAT]
␈↓ ↓⊗
␈↓ εK ((EQ (CADAR PAT)
␈↓ ↓⊗ (* To match var against (x←seg ...), match against
␈↓ εK (QUOTE =))
␈↓ ↓⊗ (seg !tem← ...), and then set x to
␈↓ εK ('MATCHEXP ('HEADP (CDDAR PAT)
␈↓ ↓⊗ (LDIFF var tem))
␈↓ εK VAR)
␈↓ ↓⊗
␈↓ εK (CDR PAT)))
␈↓ ↓⊗
␈↓ εK ((EQ (CADAR PAT)
␈↓ ↓⊗ ('AND
␈↓ εK (QUOTE '))
␈↓ ↓⊗ ('AND
␈↓ εK ('MATCHEXP ('HEADP (KWOTE (CDDAR PAT))
␈↓ ↓⊗ ('MATCHBIND
␈↓ εK VAR)
␈↓ ↓⊗ VAR
␈↓ εK (CDR PAT)))
␈↓ ↓⊗ (CONS (CDDAR PAT)
␈↓ εK [(EQ (CDAR PAT)
␈↓ ↓⊗ (CONS (CONS (QUOTE !←)
␈↓ εK (QUOTE *))
␈↓ ↓⊗ (SETQ TEM (MAKEVAR T)))
␈↓ εK ('AND
␈↓ ↓⊗ (CDR PAT)))
␈↓ εK ('AND
␈↓ ↓⊗ T NIL)
␈↓ εK ('MATCHBIND
␈↓ ↓⊗ TEM)
␈↓ εK VAR
␈↓ ↓⊗ ('SETQ←SIDE←EFFECT
␈↓ εK (CONS (QUOTE $)
␈↓ ↓⊗ (CADAR PAT)
␈↓ εK (CONS (CONS (QUOTE !←)
␈↓ ↓⊗ ('LDIFF (COPY VAR)
␈↓ εK (SETQ TEM (MAKEVAR T)))
␈↓ ↓⊗ TEM)
␈↓ εK (CDR PAT)))
␈↓ ↓⊗ (AND ORSETQFLG (CANMATCHNIL (CDDAR PAT]
␈↓ εK T NIL)
␈↓ ↓⊗ (T (HELP "CAN'T DO THIS ← YET" PAT]
␈↓ εK TEM)
␈↓ ↓⊗ [-> (* Only segmentreplaces
␈↓ εK ('RETURN ('LDIFF (COPY VAR)
␈↓ ↓⊗ get here -
␈↓ εK TEM]
␈↓ ↓⊗ similar to ←)
␈↓ εK [(FMEMB (CADAR PAT)
␈↓ ↓⊗ (COND
␈↓ εK (QUOTE (← ->)))
␈↓ ↓⊗ [(NULL (CDR PAT))
␈↓ εK ('MATCH VAR
␈↓ ↓⊗ ('AND ('MATCHBIND VAR (LIST (CDDR (CAR PAT)))
␈↓ εK (RPLACA
␈↓ ↓⊗ T NIL)
␈↓ εK PAT
␈↓ ↓⊗ ('REPLACE←SIDE←EFFECT
␈↓ εK (CONS (CADAR PAT)
␈↓ ↓⊗ VAR
␈↓ εK (CONS (CADDAR PAT)
␈↓ ↓⊗ (CADR (CAR PAT]
␈↓ εK (CONS (QUOTE !)
␈↓ ↓⊗ [[OR (ARB? (CDDAR PAT))
␈↓ εK (CDDDAR PAT]
␈↓ ↓⊗ (NOT (ELT? (CDDAR PAT]
␈↓ εK (T (HELP (QUOTE "CANT DO THIS ! YET")
␈↓ ↓⊗
␈↓ εK PAT]
␈↓ ↓⊗ (* To match var against (seg←x ...), match against
␈↓ εK [!-> (* (... !←EXPR ...))
␈↓ ↓⊗ (seg !tem← ...), and then replace var with
␈↓ εK ('AND ('MATCHBIND VAR (CDR PAT)
␈↓ ↓⊗ (NCONC/APPEND x tem))
␈↓ εK T NIL)
␈↓ ↓⊗
␈↓ εK ('REPLACE←SIDE←EFFECT
␈↓ ↓⊗
␈↓ εK VAR
␈↓ ↓⊗ ('AND ('MATCHBIND
␈↓ εK (CDAR PAT]
␈↓ ↓⊗ VAR
␈↓ εK [!← (* (... !VAR← ...))
␈↓ ↓⊗ (CONS (CDDAR PAT)
␈↓ εK (COND
␈↓ ↓⊗ (CONS (CONS (QUOTE !←)
␈↓ εK [(LOCALPATVAR (CDAR PAT))
␈↓ ↓⊗ (SETQ TEM (MAKEVAR
␈↓ εK ('AND ['SETQ (CDAR PAT)
␈↓ ↓⊗ T)))
␈↓ εK VAR
␈↓ ↓⊗ (CDR PAT)))
␈↓ εK (AND ORSETQFLG (CANMATCHNIL
␈↓ ↓⊗ T NIL)
␈↓ εK (CDR PAT]
␈↓ ↓⊗ ('REPLACE←SIDE←EFFECT
␈↓ εK ('MATCH (CDAR PAT)
␈↓ ↓⊗ ('LDIFF (COPY VAR)
␈↓ εK (CDR PAT]
␈↓ ↓⊗ TEM)
␈↓ εK (T ('AND ('MATCH VAR (CDR PAT))
␈↓ ↓⊗ (CADAR PAT]
␈↓ εK ('SETQ←SIDE←EFFECT
␈↓ ↓⊗ (T (HELP "CAN'T DO THIS REPLACE YET" PAT]
␈↓ εK (CDAR PAT)
␈↓ ↓⊗ (ANY (* Segment any's go
␈↓ εK VAR
␈↓ ↓⊗ here)
␈↓ εK (AND ORSETQFLG (CANMATCHNIL
␈↓ ↓⊗ (HELP (QUOTE "CAN'T DO AN ANY WHEN ")
␈↓ εK (CDR PAT]
␈↓ ↓⊗ (QUOTE "SOME ARE SEGMENTS")))
␈↓ εK (($$ ' = == DEFAULT)
␈↓ ↓⊗ [!
␈↓ εK (HELP
␈↓ ↓⊗ (COND
␈↓ εK "SHOULDN'T GET HERE - THESE PATS HANDLED PREVIOUSLY" PAT)
␈↓ ↓⊗ ((NULL (CDR PAT))
␈↓ εK )
␈↓ ↓⊗
␈↓ εK (HELP (QUOTE "I DONT UNDERSTAND THIS PATTERN:")
␈↓ ↓⊗ (* To MATCH VAR against (!pat) is the same as
␈↓ εK PAT)))
␈↓ ↓⊗ matching it against PAT)
␈↓ εK (T (HELP (QUOTE "WHAT'S HERE")
␈↓ ↓⊗
␈↓ εK PAT])
␈↓ ↓⊗
␈↓ εK
␈↓ ↓⊗␈↓α('MATCHBIND␈↓↓
␈↓ εK (COND
␈↓ ↓⊗ [LAMBDA (VAR PAT MUSTBEMATCH)
␈↓ εK ((NOT (EVERY PAT (FUNCTION CANMATCHNIL)))
␈↓ ↓⊗ ('MATCH VAR PAT])
␈↓ εK ('MATCHEXP VAR PAT))
␈↓ ↓⊗
␈↓ εK (T ('MATCHEXP1 VAR PAT (FUNCTION 'MATCHNNIL])
␈↓ ↓⊗␈↓α('MATCHELT␈↓↓
␈↓ εK
␈↓ ↓⊗ [LAMBDA (VAR PATELT MUSTBEMATCH)
␈↓ εK␈↓α('MATCHSUBPAT␈↓↓
␈↓ ↓⊗
␈↓ εK [LAMBDA (VAR PATELT)
␈↓ ↓⊗ (* This function matches VAR against PATELT when
␈↓ εK (PROG ((NULLCHK T))
␈↓ ↓⊗ PATELT is an "ELEMENT" pattern -
␈↓ εK (COND
␈↓ ↓⊗ MUSTBEMATCH has same meaning as in MAKEMATCH)
␈↓ εK (LISTPCHK ('AND ('LISTP VAR)
␈↓ ↓⊗
␈↓ εK ('MATCH VAR PATELT)))
␈↓ ↓⊗
␈↓ εK (T ('MATCH VAR PATELT])
␈↓ ↓⊗ (COND
␈↓ εK
␈↓ ↓⊗ ((NLISTP PATELT)
␈↓ εK␈↓α('MATCHTAIL␈↓↓
␈↓ ↓⊗ (SELECTQ PATELT
␈↓ εK [LAMBDA (VAR PAT MUSTRETURNTAIL)
␈↓ ↓⊗ (* ('RETURN VAR))
␈↓ εK
␈↓ ↓⊗ (($1 & ≠1)
␈↓ εK (* MUSTRETURNTAIL is on if the expression must be
␈↓ ↓⊗ T)
␈↓ εK the tail that matched -
␈↓ ↓⊗ (HELP (QUOTE "BAD PATTERN ELEMENT")
␈↓ εK If it is T then just return EXPRESSION;
␈↓ ↓⊗ PATELT)))
␈↓ εK otherwise, it is a variable which must be set to the
␈↓ ↓⊗ ((NLISTP (CAR PATELT))
␈↓ εK EXPRESSION)
␈↓ ↓⊗ (SELECTQ (CAR PATELT)
␈↓ εK
␈↓ ↓⊗ (DEFAULT (HELP (QUOTE
␈↓ εK
␈↓ ↓⊗ "DEFAULT SHOULD HAVE BEEN HANDLED IN ANALPAT")
␈↓ εK (PROG (MATCH SETS TEM TEM1 TAIL (LEN 0))
␈↓ ↓⊗ (QUOTE "RETURN NIL TO DO IT NOW"))
␈↓ εK (COND
␈↓ ↓⊗ (MAKEDEFAULT PATELT)
␈↓ εK [(EQ (CAAR PAT)
␈↓ ↓⊗ ('MATCHELT VAR PATELT MUSTBEMATCH))
␈↓ εK (QUOTE !←))
␈↓ ↓⊗ (==('EQ VAR (CDR PATELT)))
␈↓ εK ('SETVAR MUSTRETURNTAIL ('MATCHTAIL VAR (CDR PAT)
␈↓ ↓⊗ ['('EQUAL VAR (KWOTE (CDR PATELT]
␈↓ εK (CDAR PAT))
␈↓ ↓⊗ (=('EQUAL VAR (CDR PATELT)))
␈↓ εK (AND ORSETQFLG (CANMATCHNIL (CDR PAT]
␈↓ ↓⊗ [:(COND
␈↓ εK ((EQ (CAAR PAT)
␈↓ ↓⊗ ((OR (NLISTP (CDR PATELT))
␈↓ εK (QUOTE !->))
␈↓ ↓⊗ (EQ (CADR PATELT)
␈↓ εK (COND
␈↓ ↓⊗ (QUOTE LAMBDA)))
␈↓ εK ([NOT (FMEMB MUSTRETURNTAIL (QUOTE (NIL T]
␈↓ ↓⊗ (LIST (CDR PATELT)
␈↓ εK (HELP)))
␈↓ ↓⊗ VAR))
␈↓ εK ('REPLACE←SIDE←EFFECT
␈↓ ↓⊗ (T (SUBST VAR (QUOTE @)
␈↓ εK ('MATCHTAIL VAR (CDR PAT)
␈↓ ↓⊗ (PROG (@)
␈↓ εK T)
␈↓ ↓⊗ (DWIMIFY (CDR PATELT]
␈↓ εK (CDAR PAT)))
␈↓ ↓⊗ [ANY ('OR (MAPCAR (CDR PATELT)
␈↓ εK [(NULL (SETQ TAIL (SKIP$I PAT)))
␈↓ ↓⊗ (FUNCTION (LAMBDA (PE1)
␈↓ εK (COND
␈↓ ↓⊗ ('MATCHELT VAR PE1 T]
␈↓ εK ((NULL MUSTRETURNTAIL)
␈↓ ↓⊗ [←('AND ('MATCHELT VAR (CDDR PATELT)
␈↓ εK ('NOTLESSPLENGTH VAR LEN))
␈↓ ↓⊗ T)
␈↓ εK (T ('SETVAR MUSTRETURNTAIL ('NLEFT VAR LEN)
␈↓ ↓⊗ ('SETQ←SIDE←EFFECT
␈↓ εK ORSETQFLG]
␈↓ ↓⊗ (CADR PATELT)
␈↓ εK [(AND (NOT (EQ PAT TAIL))
␈↓ ↓⊗ VAR
␈↓ εK (COND
␈↓ ↓⊗ (AND ORSETQFLG (CANMATCHNIL (CDDR PATELT]
␈↓ εK ((NULL MUSTRETURNTAIL)
␈↓ ↓⊗ [-> ('AND ('MATCHELT VAR (CDDR PATELT)
␈↓ εK ('MATCHTAIL ('NTH VAR ('PLUS 1 LEN))
␈↓ ↓⊗ T)
␈↓ εK TAIL))
␈↓ ↓⊗ ('REPLACE←SIDE←EFFECT
␈↓ εK ((NULLPAT? TAIL)
␈↓ ↓⊗ VAR
␈↓ εK ('SETVAR MUSTRETURNTAIL ('NLEFT VAR LEN NIL]
␈↓ ↓⊗ (CADR PATELT]
␈↓ εK ((AND (EQ (CAAR PAT)
␈↓ ↓⊗ ('MATCHSUBPAT VAR PATELT)))
␈↓ εK (QUOTE !))
␈↓ ↓⊗ (T ('MATCHSUBPAT VAR PATELT])
␈↓ εK (EQ (CADAR PAT)
␈↓ ↓⊗
␈↓ εK (QUOTE ==))
␈↓ ↓⊗␈↓α('MATCHEXP␈↓↓
␈↓ εK (NOT (CDR PAT)))
␈↓ ↓⊗ [LAMBDA (VAR PAT)
␈↓ εK ('SETVAR MUSTRETURNTAIL ('TAILP (CDDAR PAT)
␈↓ ↓⊗
␈↓ εK VAR)))
␈↓ ↓⊗ (* CALL THIS FUNCTION INSTEAD OF 'MATCH IF THE VAR
␈↓ εK ((NULL (SETQ TAIL (SKIP$ANY PAT)))
␈↓ ↓⊗ MIGHT NOT BE EASY TO RECOMPUTE)
␈↓ εK (* PAT is $ followed by
␈↓ ↓⊗
␈↓ εK a bunch of fixed-length
␈↓ ↓⊗
␈↓ εK items)
␈↓ ↓⊗ ('MATCHEXP1 VAR PAT (FUNCTION 'MATCH])
␈↓ εK ('MATCH&SET ('NLEFT VAR LEN)
␈↓ ↓⊗
␈↓ εK PAT
␈↓ ↓⊗␈↓α('MATCHFIXED␈↓↓
␈↓ εK (FUNCTION 'MATCHFIXED)
␈↓ ↓⊗ [LAMBDA (VAR PAT)
␈↓ εK NIL MUSTRETURNTAIL))
␈↓ ↓⊗
␈↓ εK (($? (CAR PAT)) (* Can we just ignore it
␈↓ ↓⊗ (* This function is called when it is known that if
␈↓ εK -
␈↓ ↓⊗ any element of VAR is non NIL, then VAR is of the
␈↓ εK I.e. $ $)
␈↓ ↓⊗ right length to MATCH PAT and so no length tests
␈↓ εK ('MATCHTAIL VAR (CDR PAT)
␈↓ ↓⊗ need be performed)
␈↓ εK MUSTRETURNTAIL))
␈↓ ↓⊗
␈↓ εK (('MATCHWITHMEMB VAR PAT MUSTRETURNTAIL))
␈↓ ↓⊗
␈↓ εK ((AND (NOT (NULLPAT? TAIL))
␈↓ ↓⊗ (PROG (NULLCHK)
␈↓ εK (NOT (EQ PAT TAIL))
␈↓ ↓⊗ (NOMATCHARB? (CAR TAIL)))
␈↓ εK (COND
␈↓ ↓⊗ ('MATCH&SET ('MATCHSOME VAR
␈↓ εK (CDRFN (BLKAPPLY* CDRFN
␈↓ ↓⊗ (PROGN (RPLACD (NLEFT PAT 1 TAIL)
␈↓ εK TEM))
␈↓ ↓⊗ (QUOTE ($)))
␈↓ εK (T TEM))
␈↓ ↓⊗ PAT))
␈↓ εK PAT)
␈↓ ↓⊗ TAIL
␈↓ εK TEM)))
␈↓ ↓⊗ (FUNCTION 'MATCHEXP)
␈↓ εK ((LOCALPATVAR (SETQ TEM (MAKEVAR VARTOSET)))
␈↓ ↓⊗ (FUNCTION 'CDRLEN)
␈↓ εK ('AND ('SETQ TEM EXPR)
␈↓ ↓⊗ MUSTRETURNTAIL))
␈↓ εK (BLKAPPLY* MATCHFN (COND
␈↓ ↓⊗ (T ('SETVAR MUSTRETURNTAIL ('MATCHSOME VAR PAT)
␈↓ εK (CDRFN (BLKAPPLY* CDRFN TEM))
␈↓ ↓⊗ ORSETQFLG])
␈↓ εK (T TEM))
␈↓ ↓⊗
␈↓ εK PAT)))
␈↓ ↓⊗␈↓α('MATCHSOME␈↓↓
␈↓ εK (T [POSTPONE ('SETQ TEM (SETQ TEM (MAKEVAR T]
␈↓ ↓⊗ [LAMBDA (VAR PAT)
␈↓ εK ('AND ('SETQ TEM EXPR)
␈↓ ↓⊗ (PROG ((SOMEVARS (CONS (GENSYML VAR)
␈↓ εK ('AND (BLKAPPLY* MATCHFN
␈↓ ↓⊗ (CONS (GENSYML VAR)
␈↓ εK (COND
␈↓ ↓⊗ NIL)))
␈↓ εK (CDRFN (BLKAPPLY* CDRFN
␈↓ ↓⊗ (MUSTBEMATCH T))
␈↓ εK TEM))
␈↓ ↓⊗ ('SOME VAR (LIST (CAR SOMEVARS)
␈↓ εK (T TEM))
␈↓ ↓⊗ (CADR SOMEVARS))
␈↓ εK PAT)
␈↓ ↓⊗ (DSUBST (CAR SOMEVARS)
␈↓ εK TEM]
␈↓ ↓⊗ ('CAR (CADR SOMEVARS))
␈↓ εK (T (BLKAPPLY* MATCHFN (COND
␈↓ ↓⊗ ('MATCH (CADR SOMEVARS)
␈↓ εK (CDRFN (BLKAPPLY* CDRFN EXPR))
␈↓ ↓⊗ PAT])
␈↓ εK (T EXPR))
␈↓ ↓⊗
␈↓ εK PAT])
␈↓ ↓⊗␈↓α('MATCHWITHMEMB␈↓↓
␈↓ εK
␈↓ ↓⊗ [LAMBDA (VAR PAT MUSTRETURNTAIL)
␈↓ εK␈↓α('CDRLEN␈↓↓
␈↓ ↓⊗ (AND (MEMBPAT? PAT)
␈↓ εK [LAMBDA (EXPR)
␈↓ ↓⊗ ('MATCH&SET (EQTOMEMB ('MATCHELT VAR (CAR PAT)))
␈↓ εK ('NTH EXPR ('PLUS 1 LEN])
␈↓ ↓⊗ (RPLACA PAT (QUOTE $1))
␈↓ εK
␈↓ ↓⊗ (FUNCTION 'MATCHEXP)
␈↓ εK␈↓α(POSTPONE␈↓↓
␈↓ ↓⊗ NIL MUSTRETURNTAIL])
␈↓ εK [LAMBDA (EFFECT)
␈↓ ↓⊗
␈↓ εK (SETQ POSTPONEDEFFECTS (NCONC1 POSTPONEDEFFECTS EFFECT))
␈↓ ↓⊗␈↓α('MATCHNNIL␈↓↓
␈↓ εK T])
␈↓ ↓⊗ [LAMBDA (VAR PAT)
␈↓ εK
␈↓ ↓⊗ ('AND VAR ('MATCH VAR PAT])
␈↓ εK␈↓α('HEADP␈↓↓
␈↓ ↓⊗
␈↓ εK [LAMBDA (A B)
␈↓ ↓⊗␈↓α('MATCHEXP1␈↓↓
␈↓ εK (LIST (QUOTE HEADP)
␈↓ ↓⊗ [LAMBDA (VAR PAT FN)
␈↓ εK A B])
␈↓ ↓⊗ (COND
␈↓ εK
␈↓ ↓⊗ ((EASYTORECOMPUTE VAR)
␈↓ εK␈↓α(ABP␈↓↓
␈↓ ↓⊗ (BLKAPPLY* FN VAR PAT))
␈↓ εK [LAMBDA (PATELT SEGEXPR)
␈↓ ↓⊗ (T (PROG (EXPR (FUNNYTEM (GENSYML VAR)))
␈↓ εK (COND
␈↓ ↓⊗ (SETQ EXPR (BLKAPPLY* FN FUNNYTEM PAT))
␈↓ εK [(NLISTP (CDR PATELT))
␈↓ ↓⊗ (COND
␈↓ εK (SELECTQ (CDR PATELT)
␈↓ ↓⊗ ((OR (NULL EXPR)
␈↓ εK (("*" *) (* !* is like result←$)
␈↓ ↓⊗ (EQ EXPR T))
␈↓ εK (SETQ SETS T)
␈↓ ↓⊗ (SETQ EXPR FUNNYTEM)))
␈↓ εK (QUOTE ARB))
␈↓ ↓⊗ (SETQ EXPR (MAKESUBST FUNNYTEM VAR
␈↓ εK (($1 &) (* !$1 is the same as $)
␈↓ ↓⊗ (LIST EXPR POSTPONEDEFFECTS
␈↓ εK (QUOTE ARB))
␈↓ ↓⊗ MUSTRETURN)))
␈↓ εK (HELP (QUOTE "FUNNY NLISTP PAT AFTER ! IN")
␈↓ ↓⊗ (SETQ POSTPONEDEFFECTS (CADR EXPR))
␈↓ εK (CDR PATELT]
␈↓ ↓⊗ (SETQ MUSTRETURN (CADDR EXPR))
␈↓ εK (T (SELECTQ (CAR (CDR PATELT))
␈↓ ↓⊗ (RETURN (CAR EXPR])
␈↓ εK [' (* !'exp matches exactly
␈↓ ↓⊗
␈↓ εK length exp things)
␈↓ ↓⊗␈↓α(LOCALPATVAR␈↓↓
␈↓ εK (LENGTH (CDR (CDR PATELT]
␈↓ ↓⊗ [LAMBDA (VAR)
␈↓ εK ((= ==) (* = exp matches
␈↓ ↓⊗ (PROG ((LST BINDINGS))
␈↓ εK precomputable NUMBER of
␈↓ ↓⊗ LP (COND
␈↓ εK things)
␈↓ ↓⊗ ((NULL LST)
␈↓ εK (SETQ MATCH T)
␈↓ ↓⊗ (RETURN NIL))
␈↓ εK
␈↓ ↓⊗ ((OR (EQ VAR (CAR LST))
␈↓ εK (* THIS ISWHAT USED TO BE HERE:
␈↓ ↓⊗ (EQ VAR (CAAR LST)))
␈↓ εK (COND (SEGEXPR ('LENGTH (CDR
␈↓ ↓⊗ (RETURN T)))
␈↓ εK (CDR PATELT)))) (T (QUOTE SEG))))
␈↓ ↓⊗ (SETQ LST (CDR LST))
␈↓ εK
␈↓ ↓⊗ (GO LP])
␈↓ εK
␈↓ ↓⊗
␈↓ εK (QUOTE ARB))
␈↓ ↓⊗␈↓α('MATCH&SET␈↓↓
␈↓ εK (:(SETQ MATCH T)
␈↓ ↓⊗ [LAMBDA (EXPR PAT MATCHFN CDRFN VARTOSET)
␈↓ εK (QUOTE ARB))
␈↓ ↓⊗ (COND
␈↓ εK ((← ->)
␈↓ ↓⊗ [VARTOSET (COND
␈↓ εK (SETQ SETS T)
␈↓ ↓⊗ ((EQ T VARTOSET)
␈↓ εK (ABP (CDR (CDR PATELT))
␈↓ ↓⊗ ('AND ('SETQ (SETQ TEM (MAKEVAR T))
␈↓ εK SEGEXPR))
␈↓ ↓⊗ EXPR)
␈↓ εK (DEFAULT (* MAKEDEFAULT actually
␈↓ ↓⊗ ('AND (BLKAPPLY* MATCHFN
␈↓ εK smashes it, so go ahead
␈↓ ↓⊗ & try it again)
␈↓ εK (OR (NUMBERP (CDR PATELT))
␈↓ ↓⊗ (MAKEDEFAULT (CDR PATELT))
␈↓ εK (AND SEGEXPR (CDR PATELT))
␈↓ ↓⊗ (ABP PATELT SEGEXPR))
␈↓ εK (QUOTE SEG)))
␈↓ ↓⊗ (ANY
␈↓ εK (DEFAULT (ANALPATELT (MAKEDEFAULT PATELT)
␈↓ ↓⊗
␈↓ εK SEGEXPR))
␈↓ ↓⊗ (* ! (any ...) matches the MAX of ANAL!PAT of the
␈↓ εK [(= == ' :)
␈↓ ↓⊗ elts of the any)
␈↓ εK (SETQ MATCH T) (* = FOO matches an
␈↓ ↓⊗
␈↓ εK element)
␈↓ ↓⊗
␈↓ εK (COND
␈↓ ↓⊗ (ANALPAT (CDR (CDR PATELT))
␈↓ εK (SEGEXPR 1)
␈↓ ↓⊗ (AND SEGEXPR (QUOTE SEGEXPR))
␈↓ εK (T (QUOTE ELT]
␈↓ ↓⊗ (FUNCTION ANAL!PAT)))
␈↓ εK [ANY (* It's the MAX of them
␈↓ ↓⊗ (COND
␈↓ εK all)
␈↓ ↓⊗ [(NOT (CDDR PATELT))
␈↓ εK (ANALPAT (CDR PATELT)
␈↓ ↓⊗ (COND
␈↓ εK (AND SEGEXPR (QUOTE SEGEXPR]
␈↓ ↓⊗ ((LISTP (CADR PATELT))
␈↓ εK (← (* It's a set, with the
␈↓ ↓⊗ (RPLNODE PATELT (CADR PATELT))
␈↓ εK same PROP as what's
␈↓ ↓⊗ (ANALPATELT PATELT SEGEXPR))
␈↓ εK being set)
␈↓ ↓⊗ (T (ANALPATELT (CADR PATELT)
␈↓ εK (SETQ SETS T)
␈↓ ↓⊗ SEGEXPR]
␈↓ εK (ANALPATELT (CDDR PATELT)
␈↓ ↓⊗ (T (ANALPAT (CDR PATELT])
␈↓ εK SEGEXPR))
␈↓ ↓⊗
␈↓ εK (-> (* Ditto)
␈↓ ↓⊗␈↓α(RPLNODE␈↓↓
␈↓ εK (SETQ SETS T)
␈↓ ↓⊗ [LAMBDA (X Y)
␈↓ εK (ANALPATELT (CDDR PATELT)
␈↓ ↓⊗ (RPLACA (RPLACD X (CDR Y))
␈↓ εK SEGEXPR))
␈↓ ↓⊗ (CAR Y])
␈↓ εK ((!← !->)
␈↓ ↓⊗)
␈↓ εK (SETQ SETS T)
␈↓ ↓⊗␈↓α(DEFINEQ␈↓↓
␈↓ εK 0)
␈↓ ↓⊗
␈↓ εK (PROGN (* Got a PATELT which is
␈↓ ↓⊗␈↓α(ANALPATELT␈↓↓
␈↓ εK a list of pats)
␈↓ ↓⊗ [LAMBDA (PATELT SEGEXPR)
␈↓ εK (ANALPAT PATELT)
␈↓ ↓⊗
␈↓ εK (COND
␈↓ ↓⊗ (* Analyze PATELT , returning either -
␈↓ εK (SEGEXPR 1)
␈↓ ↓⊗ "ELT" if PATELT matches a single element -
␈↓ εK (T (QUOTE ELT])
␈↓ ↓⊗ "SEG" if PATELT matches a segment of fixed but not
␈↓ εK
␈↓ ↓⊗ given size -
␈↓ εK␈↓α(ANALPAT␈↓↓
␈↓ ↓⊗ A number if PATELT matches a segment of fixed, given
␈↓ εK [LAMBDA (PAT FLG FN TAIL)
␈↓ ↓⊗ size -
␈↓ εK
␈↓ ↓⊗ Or "ARB" if PATELT matches a segment of not
␈↓ εK (* Calls either ANALPATELT or FN on the elements of
␈↓ ↓⊗ precomputable size)
␈↓ εK PAT (up to TAIL) and returns the MAXANAL of them -
␈↓ ↓⊗
␈↓ εK The value of FLG determinses whether MAXANAL returns
␈↓ ↓⊗
␈↓ εK a sum or a maximum)
␈↓ ↓⊗
␈↓ εK
␈↓ ↓⊗ (* Unless SEGEXPR is on, in which case, the size of
␈↓ εK
␈↓ ↓⊗ the expr is returned instead of seg)
␈↓ εK (PROG (VAL)
␈↓ ↓⊗
␈↓ εK LP (COND
␈↓ ↓⊗
␈↓ εK ((OR (EQ PAT TAIL)
␈↓ ↓⊗
␈↓ εK (NOT PAT))
␈↓ ↓⊗ (* Also, if the PATELT is a "SET", sets special
␈↓ εK (RETURN VAL)))
␈↓ ↓⊗ variable "SETS" -
␈↓ εK (SETQ VAL (MAXANAL (BLKAPPLY (OR FN (QUOTE ANALPATELT))
␈↓ ↓⊗ If it contains a match (i.e., other than $i's or $'s
␈↓ εK (LIST (CAR PAT)))
␈↓ ↓⊗ or sets involving those) it sets the special
␈↓ εK VAL FLG))
␈↓ ↓⊗ variable "MATCH")
␈↓ εK (SETQ PAT (CDR PAT))
␈↓ ↓⊗
␈↓ εK (GO LP])
␈↓ ↓⊗
␈↓ εK
␈↓ ↓⊗ (COND
␈↓ εK␈↓α(MAXANAL␈↓↓
␈↓ ↓⊗ ((NLISTP PATELT)
␈↓ εK [LAMBDA (VAL1 VAL2 FLG)
␈↓ ↓⊗ (SELECTQ PATELT
␈↓ εK (COND
␈↓ ↓⊗ [($1 &)
␈↓ εK ((NOT VAL1)
␈↓ ↓⊗ (COND
␈↓ εK VAL2)
␈↓ ↓⊗ (SEGEXPR 1)
␈↓ εK ((NOT VAL2)
␈↓ ↓⊗ (T (QUOTE ELT]
␈↓ εK VAL1)
␈↓ ↓⊗ [("*" *)
␈↓ εK ((OR (EQ VAL2 (QUOTE ARB))
␈↓ ↓⊗ (SETQ SETS T)
␈↓ εK (EQ VAL1 (QUOTE ARB)))
␈↓ ↓⊗ (COND
␈↓ εK (QUOTE ARB))
␈↓ ↓⊗ (SEGEXPR 1)
␈↓ εK ((OR (EQ VAL1 (QUOTE SEG))
␈↓ ↓⊗ (T (QUOTE ELT]
␈↓ εK (EQ VAL2 (QUOTE SEG)))
␈↓ ↓⊗ (($ --)
␈↓ εK (QUOTE SEG))
␈↓ ↓⊗ (QUOTE ARB))
␈↓ εK ((EQ FLG (QUOTE SEGEXPR))
␈↓ ↓⊗ (HELP (QUOTE "FUNNY PAT IN ANALPATELT")
␈↓ εK ('PLUS VAL1 VAL2))
␈↓ ↓⊗ PATELT)))
␈↓ εK (FLG (IPLUS (OR (NUMBERP VAL1)
␈↓ ↓⊗ (T (SELECTQ (CAR PATELT)
␈↓ εK 1)
␈↓ ↓⊗ (! (ABP PATELT SEGEXPR))
␈↓ εK (OR (NUMBERP VAL2)
␈↓ ↓⊗ ($$ (* Either $$ NUMBER or
␈↓ εK 1)))
␈↓ ↓⊗ $$ EXPRESSION)
␈↓ εK [(EQ VAL1 (QUOTE ELT))
␈↓ ↓⊗ (COND
␈↓ εK (FMEMB (CDR PATELT)
␈↓ ↓⊗ ((OR (EQ VAL2 1)
␈↓ εK (QUOTE (& $1 ≠1])
␈↓ ↓⊗ (EQ VAL2 (QUOTE ELT)))
␈↓ εK
␈↓ ↓⊗ VAL2)
␈↓ εK␈↓α(SKIP$I␈↓↓
␈↓ ↓⊗ (T (QUOTE SEG]
␈↓ εK [LAMBDA (PAT)
␈↓ ↓⊗ [(EQ VAL2 (QUOTE ELT))
␈↓ εK
␈↓ ↓⊗ (COND
␈↓ εK (* Returns to the first TAIL of PAT which doesn't
␈↓ ↓⊗ ((EQ VAL1 1)
␈↓ εK begin with a $i or a $$foo -
␈↓ ↓⊗ VAL1)
␈↓ εK Sets the variable "LEN" to the total length of
␈↓ ↓⊗ (T (QUOTE SEG]
␈↓ εK things skipped over)
␈↓ ↓⊗ (T (QUOTE SEG])
␈↓ εK
␈↓ ↓⊗
␈↓ εK
␈↓ ↓⊗␈↓α(ANAL!PAT␈↓↓
␈↓ εK (SOME PAT (FUNCTION (LAMBDA (ELT)
␈↓ ↓⊗ [LAMBDA (PAT SEGEXPR)
␈↓ εK (COND
␈↓ ↓⊗ (COND
␈↓ εK ((FMEMB ELT (QUOTE (& $1 ≠1)))
␈↓ ↓⊗ ((NLISTP PAT)
␈↓ εK (SETQ LEN ('PLUS 1 LEN))
␈↓ ↓⊗ (SELECTQ PAT
␈↓ εK NIL)
␈↓ ↓⊗ (("*" *) (* !* is like result←$)
␈↓ εK ((EQ (CAR ELT)
␈↓ ↓⊗ (SETQ SETS T)
␈↓ εK (QUOTE $$))
␈↓ ↓⊗ (QUOTE ARB))
␈↓ εK (SETQ LEN ('PLUS LEN (CDR ELT)))
␈↓ ↓⊗ (($1 &) (* !$1 is the same as $)
␈↓ εK NIL)
␈↓ ↓⊗ (QUOTE ARB))
␈↓ εK (T])
␈↓ ↓⊗ (HELP (QUOTE "FUNNY NLISTP PAT AFTER ! IN")
␈↓ εK
␈↓ ↓⊗ PAT)))
␈↓ εK␈↓α(SKIP$␈↓↓
␈↓ ↓⊗ (T (SELECTQ (CAR PAT)
␈↓ εK [LAMBDA (PAT SETOK MATCHOK TAIL)
␈↓ ↓⊗ (' (* !'exp matches exactly
␈↓ εK
␈↓ ↓⊗ length exp things)
␈↓ εK (* SCANS PAT UNTIL ONE OF THE FOLLOWING CONDITIONS
␈↓ ↓⊗ (LENGTH (CDR PAT)))
␈↓ εK OCCURS: -
␈↓ ↓⊗ ((= ==) (* = exp matches
␈↓ εK (1) TAIL IS HIT -
␈↓ ↓⊗ precomputable NUMBER of
␈↓ εK (2) A PATTERN ELEMENT WHICH MATCHES AN ARBITRARY
␈↓ ↓⊗ things)
␈↓ εK LENGTH SEGMENT IS HIT -
␈↓ ↓⊗ (SETQ MATCH T)
␈↓ εK (3) SETOK IS NIL AND A PATTERN ELMENT INVOLVING A ←
␈↓ ↓⊗
␈↓ εK IS HIT -
␈↓ ↓⊗ (* THIS ISWHAT USED TO BE HERE:
␈↓ εK (4) MATCHOK IS NIL AND A PATTERN ELMENT INVOLVING A
␈↓ ↓⊗ (COND (SEGEXPR ('LENGTH (CDR PAT)))
␈↓ εK "MATCH" OF ANYKIND IS HIT -
␈↓ ↓⊗ (T (QUOTE SEG))))
␈↓ εK (5) THE END OF PAT IS REACHED)
␈↓ ↓⊗
␈↓ εK
␈↓ ↓⊗
␈↓ εK
␈↓ ↓⊗ (QUOTE ARB))
␈↓ εK
␈↓ ↓⊗ (:(SETQ MATCH T)
␈↓ εK (* The free variables SETS and MATCH are set to T if
␈↓ ↓⊗ (QUOTE ARB))
␈↓ εK a set or MATCH (respectively) are found in any of
␈↓ ↓⊗ ((← ->)
␈↓ εK the pattern elements passed over)
␈↓ ↓⊗ (SETQ SETS T)
␈↓ εK
␈↓ ↓⊗ (ANAL!PAT (CDDR PAT)))
␈↓ εK
␈↓ ↓⊗ (DEFAULT (* MAKEDEFAULT actually
␈↓ εK (PROG (OLDSET OLDMATCH)
␈↓ ↓⊗ smashes it, so go ahead
␈↓ εK LP (SETQ OLDSET SETS)
␈↓ ↓⊗ & try it again)
␈↓ εK (SETQ OLDMATCH MATCH)
␈↓ ↓⊗ (MAKEDEFAULT PAT)
␈↓ εK [COND
␈↓ ↓⊗ (ANAL!PAT PAT SEGEXPR))
␈↓ εK ((OR (NULL PAT)
␈↓ ↓⊗ (ANY
␈↓ εK (EQ PAT TAIL))
␈↓ ↓⊗
␈↓ εK (RETURN PAT))
␈↓ ↓⊗ (* ! (any ...) matches the MAX of ANAL!PAT of the
␈↓ εK ((OR (EQ (SETQ TEM (ANALPATELT (CAR PAT)
␈↓ ↓⊗ elts of the any)
␈↓ εK T))
␈↓ ↓⊗
␈↓ εK (QUOTE ARB))
␈↓ ↓⊗
␈↓ εK (AND (NOT SETOK)
␈↓ ↓⊗ (ANALPAT (CDR PAT)
␈↓ εK SETS)
␈↓ ↓⊗ (AND SEGEXPR (QUOTE SEGEXPR))
␈↓ εK (AND (NOT MATCHOK)
␈↓ ↓⊗ (FUNCTION ANAL!PAT)))
␈↓ εK MATCH))
␈↓ ↓⊗ (PROGN
␈↓ εK (SETQ SETS OLDSET)
␈↓ ↓⊗
␈↓ εK (SETQ MATCH OLDMATCH)
␈↓ ↓⊗ (* Otherwise, there is a !
␈↓ εK (RETURN PAT))
␈↓ ↓⊗ (PAT) so it's the MAX, except if there are all fixed
␈↓ εK (T (SETQ LEN ('PLUS TEM LEN]
␈↓ ↓⊗ segs, add'em up)
␈↓ εK (SETQ PAT (CDR PAT))
␈↓ ↓⊗
␈↓ εK (GO LP])
␈↓ ↓⊗
␈↓ εK
␈↓ ↓⊗ (ANALPAT PAT (COND
␈↓ εK␈↓α(SKIP$ANY␈↓↓
␈↓ ↓⊗ (SEGEXPR (QUOTE SEGEXPR))
␈↓ εK [LAMBDA (PAT)
␈↓ ↓⊗ (T T))
␈↓ εK
␈↓ ↓⊗ NIL NIL)
␈↓ εK (* Scans PAT until a pattern element which matches
␈↓ ↓⊗ (QUOTE ARB])
␈↓ εK an arbitrary length segment is hit)
␈↓ ↓⊗
␈↓ εK
␈↓ ↓⊗␈↓α($?␈↓↓
␈↓ εK
␈↓ ↓⊗ [LAMBDA (PATELT)
␈↓ εK
␈↓ ↓⊗ (OR (FMEMB PATELT (QUOTE ($ ≠ --)))
␈↓ εK (* The free variables SETS and MATCH are set to T if
␈↓ ↓⊗ (AND (EQ (CAR PATELT (QUOTE !))
␈↓ εK a set or MATCH (respectively) are found in any of
␈↓ ↓⊗ the pattern elements passed over)
␈↓ εK ($? PATELT))
␈↓ ↓⊗
␈↓ εK (T (SELECTQ (CAR PATELT)
␈↓ ↓⊗
␈↓ εK (! (NOMATCHELT? (CDR PATELT)))
␈↓ ↓⊗ (PROG (OLDSET OLDMATCH TEM)
␈↓ εK (DEFAULT (NOMATCHARB? (MAKEDEFAULT PATELT)))
␈↓ ↓⊗ LP (SETQ OLDSET SETS)
␈↓ εK ((-> ←)
␈↓ ↓⊗ (SETQ OLDMATCH MATCH)
␈↓ εK (NOMATCHARB? (CDDR PATELT)))
␈↓ ↓⊗ [COND
␈↓ εK ((!← !->)
␈↓ ↓⊗ ((NULL PAT)
␈↓ εK (HELP "NOMATCHARB? SHOULDNT BE GIVEN" PATELT))
␈↓ ↓⊗ (RETURN PAT))
␈↓ εK NIL])
␈↓ ↓⊗ ((EQ (SETQ TEM (ANALPATELT (CAR PAT)
␈↓ εK
␈↓ ↓⊗ T))
␈↓ εK␈↓α(NOMATCHELT?␈↓↓
␈↓ ↓⊗ (QUOTE ARB))
␈↓ εK [LAMBDA (PAT)
␈↓ ↓⊗ (SETQ SETS OLDSET)
␈↓ εK (PROG (MATCH SETS)
␈↓ ↓⊗ (SETQ MATCH OLDMATCH)
␈↓ εK (AND (EQ (ANAL!PAT PAT)
␈↓ ↓⊗ (RETURN PAT))
␈↓ εK (QUOTE ARB))
␈↓ ↓⊗ (T (SETQ LEN ('PLUS TEM LEN]
␈↓ εK (NOT MATCH])
␈↓ ↓⊗ (SETQ PAT (CDR PAT))
␈↓ εK
␈↓ ↓⊗ (GO LP])
␈↓ εK␈↓α(SUBPAT?␈↓↓
␈↓ ↓⊗
␈↓ εK [LAMBDA (PATELT)
␈↓ ↓⊗␈↓α(ELT?␈↓↓
␈↓ εK (AND (LISTP PATELT)
␈↓ ↓⊗ [LAMBDA (PATELT)
␈↓ εK (NOT (FMEMB (CAR PATELT)
␈↓ ↓⊗ (COND
␈↓ εK (QUOTE (! $$ DEFAULT = == ' : ANY ← -> !← !->])
␈↓ ↓⊗ ((NLISTP PATELT)
␈↓ εK
␈↓ ↓⊗ (SELECTQ PATELT
␈↓ εK␈↓α(NOMATCHARBCAR?␈↓↓
␈↓ ↓⊗ ((≠1 $1 & *)
␈↓ εK [LAMBDA (PAT)
␈↓ ↓⊗ T)
␈↓ εK
␈↓ ↓⊗ (($ ≠ --)
␈↓ εK
␈↓ ↓⊗ NIL)
␈↓ εK
␈↓ ↓⊗ (HELP (QUOTE "FUNNY PAT IN ELT?")
␈↓ εK
␈↓ ↓⊗ PATELT)))
␈↓ εK
␈↓ ↓⊗ (T (SELECTQ (CAR PATELT)
␈↓ εK
␈↓ ↓⊗ (DEFAULT (MAKEDEFAULT PATELT)
␈↓ εK
␈↓ ↓⊗ T)
␈↓ εK
␈↓ ↓⊗ ((= == ' :)
␈↓ εK
␈↓ ↓⊗ T)
␈↓ εK
␈↓ ↓⊗ ((-> ←)
␈↓ εK
␈↓ ↓⊗ (ELT? (CDDR PATELT)))
␈↓ εK
␈↓ ↓⊗ ((!← !-> ! $$)
␈↓ εK
␈↓ ↓⊗ NIL)
␈↓ εK (AND PAT (OR (NOMATCHARB? (CAR PAT))
␈↓ ↓⊗ T])
␈↓ εK (AND (OR (EQ (CAAR PAT)
␈↓ ↓⊗
␈↓ εK (QUOTE !->))
␈↓ ↓⊗␈↓α(MEMBPAT?␈↓↓
␈↓ εK (EQ (CAAR PAT)
␈↓ ↓⊗ [LAMBDA (PAT) (* Can a MEMB be used
␈↓ εK (QUOTE !←)))
␈↓ ↓⊗ for pat?)
␈↓ εK (NOMATCHARBCAR? (CDR PAT])
␈↓ ↓⊗ (AND (FMEMB (CAAR PAT)
␈↓ εK
␈↓ ↓⊗ (QUOTE (' = ==)))
␈↓ εK␈↓α(NULLPAT?␈↓↓
␈↓ ↓⊗ (PROG (SETS MATCH TEM3 (PAT2 (CDR PAT)))
␈↓ εK [LAMBDA (PAT)
␈↓ ↓⊗
␈↓ εK (OR (AND (NULL PAT)
␈↓ ↓⊗ (* Check if PAT ends is ($ 'foo nomatch nomatch ...
␈↓ εK (NOT NULLCHK))
␈↓ ↓⊗ Arb-nomatch ...))
␈↓ εK (AND PAT (PROG ((LSTPAT PAT))
␈↓ ↓⊗
␈↓ εK LP (COND
␈↓ ↓⊗
␈↓ εK ((NULL LSTPAT)
␈↓ ↓⊗ LP (COND
␈↓ εK (RETURN T))
␈↓ ↓⊗ ((NULL PAT2)
␈↓ εK ((NOT ($? (CAR LSTPAT)))
␈↓ ↓⊗ (RETURN))
␈↓ εK (RETURN NIL)))
␈↓ ↓⊗ ((AND (OR (EQ (SETQ TEM3 (ANALPATELT (CAR PAT2)))
␈↓ εK (SETQ LSTPAT (CDR LSTPAT))
␈↓ ↓⊗ (QUOTE ELT))
␈↓ εK (GO LP])
␈↓ ↓⊗ (NUMBERP TEM3))
␈↓ εK
␈↓ ↓⊗ (NULL MATCH))
␈↓ εK␈↓α(CANMATCHNIL␈↓↓
␈↓ ↓⊗ (SETQ PAT2 (CDR PAT2)))
␈↓ εK [LAMBDA (PATELT)
␈↓ ↓⊗ ((AND (NULL MATCH)
␈↓ εK (COND
␈↓ ↓⊗ (EQ TEM3 (QUOTE ARB)))
␈↓ εK ((NLISTP PATELT)
␈↓ ↓⊗ (RETURN PAT2))
␈↓ εK T)
␈↓ ↓⊗ (T (RETURN)))
␈↓ εK [(SUBPAT? PATELT)
␈↓ ↓⊗ (GO LP])
␈↓ εK (EVERY PATELT (FUNCTION (LAMBDA (X)
␈↓ ↓⊗
␈↓ εK (AND (NOT (ELT? X))
␈↓ ↓⊗␈↓α(ARB?␈↓↓
␈↓ εK (CANMATCHNIL X]
␈↓ ↓⊗ [LAMBDA (PATELT)
␈↓ εK ((NLISTP (CAR PATELT))
␈↓ ↓⊗ (EQ (ANALPATELT PATELT)
␈↓ εK (SELECTQ (CAR PATELT)
␈↓ ↓⊗ (QUOTE ARB])
␈↓ εK [$$ (NOT (AND (NUMBERP (CDR PATELT))
␈↓ ↓⊗
␈↓ εK (IGREATERP (CDR PATELT)
␈↓ ↓⊗␈↓α(NOMATCHARB?␈↓↓
␈↓ εK 2]
␈↓ ↓⊗ [LAMBDA (PATELT)
␈↓ εK ((← ->)
␈↓ ↓⊗ (COND
␈↓ εK (CANMATCHNIL (CDDR PATELT)))
␈↓ ↓⊗ ((NLISTP PATELT)
␈↓ εK ('(NULL (CDR PATELT)))
␈↓ ↓⊗ (ANY (PROG ((LST (CDR PATELT)))
␈↓ εK (CDAR CDR CAR)
␈↓ ↓⊗ LP (COND
␈↓ εK (CDDAAR CDR CDAAR)
␈↓ ↓⊗ ((NULL LST)
␈↓ εK (CADAAR CAR CDAAR)
␈↓ ↓⊗ (RETURN))
␈↓ εK (CDAAR CDR CAAR)
␈↓ ↓⊗ ((CANMATCHNIL (CAR LST))
␈↓ εK (CDAAAR CDR CAAAR)
␈↓ ↓⊗ (RETURN T)))
␈↓ εK (CAAAAR CAR CAAAR)
␈↓ ↓⊗ (SETQ LST (CDR LST))
␈↓ εK (CAAAR CAR CAAR)
␈↓ ↓⊗ (GO LP)))
␈↓ εK (CAAR CAR CAR]
␈↓ ↓⊗ (!
␈↓ εK (COND
␈↓ ↓⊗
␈↓ εK ((NULL TEM)
␈↓ ↓⊗ (* This isn't really right, but i'm too lazy to do
␈↓ εK X)
␈↓ ↓⊗ the analysys and will assume it can match NIL)
␈↓ εK (T (LIST (CADR TEM)
␈↓ ↓⊗
␈↓ εK (LIST (CADDR TEM)
␈↓ ↓⊗
␈↓ εK (CADR X])
␈↓ ↓⊗ T)
␈↓ εK
␈↓ ↓⊗ ((= ==)
␈↓ εK␈↓α(GENSYML␈↓↓
␈↓ ↓⊗ T)
␈↓ εK [LAMBDA (X)
␈↓ ↓⊗ (($ -- ≠)
␈↓ εK (OR (CAR (SETQ GENSYMVARLIST (CDR GENSYMVARLIST)))
␈↓ ↓⊗ (CANMATCHNIL (CDR PATELT)))
␈↓ εK (GENSYM])
␈↓ ↓⊗ T))
␈↓ εK
␈↓ ↓⊗ (T T])
␈↓ εK␈↓α(MAKESUBST␈↓↓
␈↓ ↓⊗)
␈↓ εK [LAMBDA (OLD NEW EXPR)
␈↓ ↓⊗␈↓α(DEFINEQ␈↓↓
␈↓ εK (PROG [FOUNDBEFORE (SAVNEW NEW)
␈↓ ↓⊗
␈↓ εK (EASYFNS (QUOTE (CAR CDR SETQ]
␈↓ ↓⊗␈↓α(EASYTORECOMPUTE␈↓↓
␈↓ εK (MAKESUBST1 (SETQ EXPR (COPY EXPR)))
␈↓ ↓⊗ [LAMBDA (EXPR)
␈↓ εK (RETURN EXPR])
␈↓ ↓⊗
␈↓ εK
␈↓ ↓⊗ (* If the EXPRESSION is some cadddaars of a
␈↓ εK␈↓α(MAKESUBST1␈↓↓
␈↓ ↓⊗ variable, return that variable
␈↓ εK [LAMBDA (EXPR)
␈↓ ↓⊗ (something needs to check for VARS bound IN somes
␈↓ εK (COND
␈↓ ↓⊗ and internal forms for WHEN it can't use it for the
␈↓ εK ((NLISTP EXPR)
␈↓ ↓⊗ *'s value))
␈↓ εK EXPR)
␈↓ ↓⊗
␈↓ εK ((EQ (CAR EXPR) OLD)
␈↓ ↓⊗
␈↓ εK (COND
␈↓ ↓⊗ (OR (AND (NLISTP EXPR)
␈↓ εK ((NOT FOUNDBEFORE)
␈↓ ↓⊗ EXPR)
␈↓ εK (SETQ FOUNDBEFORE EXPR))
␈↓ ↓⊗ (AND (OR (GETP (CAR EXPR)
␈↓ εK ((NLISTP FOUNDBEFORE))
␈↓ ↓⊗ (QUOTE CROPS))
␈↓ εK ((EASYTORECOMPUTE NEW)
␈↓ ↓⊗ (FMEMB (CAR EXPR)
␈↓ εK (SETQ NEW (RECOMPUTATION NEW))
␈↓ ↓⊗ EASYFNS))
␈↓ εK (SETQ FOUNDBEFORE (QUOTE RECOMPUTED)))
␈↓ ↓⊗ (EASYTORECOMPUTE (CADR EXPR])
␈↓ εK (T (RPLACA FOUNDBEFORE ('SETQ (SETQ NEW (GENSYML OLD))
␈↓ ↓⊗
␈↓ εK SAVNEW))
␈↓ ↓⊗␈↓α(EQTOMEMB␈↓↓
␈↓ εK (SETQ FOUNDBEFORE T)
␈↓ ↓⊗ [LAMBDA (EXPR)
␈↓ εK (BIND NEW)))
␈↓ ↓⊗ (LIST (SELECTQ (CAR EXPR)
␈↓ εK (RPLACA EXPR NEW)
␈↓ ↓⊗ (EQUAL (QUOTE MEMBER))
␈↓ εK (MAKESUBST1 (CDR EXPR)))
␈↓ ↓⊗ (EQ (QUOTE MEMB))
␈↓ εK (T (MAKESUBST1 (CAR EXPR))
␈↓ ↓⊗ (HELP (QUOTE "BAD EQ EXPR IN EQTOMEMB")
␈↓ εK (MAKESUBST1 (CDR EXPR])
␈↓ ↓⊗ EXPR))
␈↓ εK
␈↓ ↓⊗ (CADDR EXPR)
␈↓ εK␈↓α(FORMEXPAND␈↓↓
␈↓ ↓⊗ (CADR EXPR])
␈↓ εK [LAMBDA (LIST AT)
␈↓ ↓⊗
␈↓ εK
␈↓ ↓⊗␈↓α(FULLEXPANSION␈↓↓
␈↓ εK (* Searches for (AT --) AT the top level of list and
␈↓ ↓⊗ [LAMBDA (X)
␈↓ εK does a (1) up (bo 1) on them)
␈↓ ↓⊗ (PROG [(TEM (FASSOC (CAR X)
␈↓ εK
␈↓ ↓⊗ (QUOTE ((CDDDDR CDR CDDDR)
␈↓ εK
␈↓ ↓⊗ (CADDDR CAR CDDDR)
␈↓ εK [MAP LIST (FUNCTION (LAMBDA (X)
␈↓ ↓⊗ (CDDDR CDR CDDR)
␈↓ εK (AND (EQ (CAR (CAR X))
␈↓ ↓⊗ (CDADDR CDR CADDR)
␈↓ εK AT)
␈↓ ↓⊗ (CAADDR CAR CADDR)
␈↓ εK (RPLACD X (NCONC (CDDR (CAR X))
␈↓ ↓⊗ (CADDR CAR CDDR)
␈↓ εK (CDR X)))
␈↓ ↓⊗ (CDDR CDR CDR)
␈↓ εK (RPLACA X (CADR (CAR X]
␈↓ ↓⊗ (CDDADR CDR CDADR)
␈↓ εK LIST])
␈↓ ↓⊗ (CADADR CAR CDADR)
␈↓ εK
␈↓ ↓⊗ (CDADR CDR CADR)
␈↓ εK␈↓α(BIND␈↓↓
␈↓ ↓⊗ (CDAADR CDR CAADR)
␈↓ εK [LAMBDA (VAR)
␈↓ ↓⊗ (CAAADR CAR CAADR)
␈↓ εK (SETQ BINDINGS (CONS VAR BINDINGS])
␈↓ ↓⊗ (CAADR CAR CADR)
␈↓ εK
␈↓ ↓⊗ (CADR CAR CDR)
␈↓ εK␈↓α(BOUNDVAR␈↓↓
␈↓ ↓⊗ (CDDDAR CDR CDDAR)
␈↓ εK [LAMBDA (X)
␈↓ ↓⊗ (CADDAR CAR CDDAR)
␈↓ εK (AND X (NOT (FMEMB X SOMEVARS])
␈↓ ↓⊗ (CDDAR CDR CDAR)
␈↓ εK
␈↓ ↓⊗ (CDADAR CDR CADAR)
␈↓ εK␈↓α(RECOMPUTATION␈↓↓
␈↓ ↓⊗ (CAADAR CAR CADAR)
␈↓ εK [LAMBDA (EXPR)
␈↓ ↓⊗ (CADAR CAR CDAR)
␈↓ εK (COND
␈↓ ↓⊗ ((NLISTP EXPR)
␈↓ εK VAR))
␈↓ ↓⊗ EXPR)
␈↓ εK (T ('NTH{NUMBER⎇ (LIST (QUOTE CDDDDR)
␈↓ ↓⊗ [[OR (GETP (CAR EXPR)
␈↓ εK VAR)
␈↓ ↓⊗ (QUOTE CROPS))
␈↓ εK (IDIFFERENCE LEN 4])
␈↓ ↓⊗ (FMEMB (CAR EXPR)
␈↓ εK
␈↓ ↓⊗ (QUOTE (CAR CDR]
␈↓ εK␈↓α('OR␈↓↓
␈↓ ↓⊗ (LIST (CAR EXPR)
␈↓ εK [LAMBDA (EXPRLIST)
␈↓ ↓⊗ (EASYTORECOMPUTE (CADR EXPR]
␈↓ εK (CONS (QUOTE OR)
␈↓ ↓⊗ ((EQ (CAR EXPR)
␈↓ εK (FORMEXPAND EXPRLIST (QUOTE OR])
␈↓ ↓⊗ (QUOTE SETQ))
␈↓ εK
␈↓ ↓⊗ (CADR EXPR))
␈↓ εK␈↓α('PLUS␈↓↓
␈↓ ↓⊗ (T (HELP "CANT RECOMPUTE"])
␈↓ εK [LAMBDA (EXPR1 EXPR2)
␈↓ ↓⊗
␈↓ εK (COND
␈↓ ↓⊗␈↓α(MAKEVAR␈↓↓
␈↓ εK ((AND (NUMBERP EXPR1)
␈↓ ↓⊗ [LAMBDA (X)
␈↓ εK (NUMBERP EXPR2))
␈↓ ↓⊗ (COND
␈↓ εK (IPLUS EXPR1 EXPR2))
␈↓ ↓⊗ ((EQ X T)
␈↓ εK ((AND (NUMBERP EXPR1)
␈↓ ↓⊗ (BIND (SETQ X (GENSYML X)))
␈↓ εK (NUMBERP EXPR2))
␈↓ ↓⊗ X)
␈↓ εK (IPLUS EXPR1 EXPR2))
␈↓ ↓⊗ (T X])
␈↓ εK (T (PROG ((SUM 0)
␈↓ ↓⊗)
␈↓ εK (LST (FORMEXPAND (LIST EXPR1 EXPR2)
␈↓ ↓⊗␈↓α(DEFINEQ␈↓↓
␈↓ εK (QUOTE IPLUS)))
␈↓ ↓⊗
␈↓ εK VAL)
␈↓ ↓⊗␈↓α('NLEFT␈↓↓
␈↓ εK [MAPC LST (FUNCTION (LAMBDA (X)
␈↓ ↓⊗ [LAMBDA (EXPR N TAIL)
␈↓ εK (COND
␈↓ ↓⊗ (COND
␈↓ εK ((NUMBERP X)
␈↓ ↓⊗ (TAIL (LIST (QUOTE NLEFT)
␈↓ εK (SETQ SUM (IPLUS X SUM)))
␈↓ ↓⊗ EXPR N TAIL))
␈↓ εK (T (SETQ VAL (NCONC1 VAL X]
␈↓ ↓⊗ ((EQ N 0)
␈↓ εK (COND
␈↓ ↓⊗ ('CDR ('LAST EXPR)))
␈↓ εK ((NULL VAL)
␈↓ ↓⊗ ((EQ N 1)
␈↓ εK SUM)
␈↓ ↓⊗ ('LAST EXPR))
␈↓ εK ((IGREATERP SUM 0)
␈↓ ↓⊗ (T (LIST (QUOTE NLEFT)
␈↓ εK (CONS (QUOTE IPLUS)
␈↓ ↓⊗ EXPR N])
␈↓ εK (CONS SUM VAL)))
␈↓ ↓⊗
␈↓ εK ((NULL (CDR VAL))
␈↓ ↓⊗␈↓α('NOT␈↓↓
␈↓ εK (CAR VAL))
␈↓ ↓⊗ [LAMBDA (X)
␈↓ εK (T (CONS (QUOTE IPLUS)
␈↓ ↓⊗ (COND
␈↓ εK VAL])
␈↓ ↓⊗ ((FMEMB (CAR X)
␈↓ εK
␈↓ ↓⊗ (QUOTE (NOT NULL)))
␈↓ εK␈↓α('REPLACE␈↓↓
␈↓ ↓⊗ (CADR X))
␈↓ εK [LAMBDA (VAR EXPR)
␈↓ ↓⊗ (T (LIST (QUOTE NOT)
␈↓ εK (SETQ VAR (FULLEXPANSION VAR))
␈↓ ↓⊗ X])
␈↓ εK (COND
␈↓ ↓⊗
␈↓ εK ((EQ (CAR VAR)
␈↓ ↓⊗␈↓α('NOTLESSPLENGTH␈↓↓
␈↓ εK (QUOTE CAR))
␈↓ ↓⊗ [LAMBDA (X N)
␈↓ εK (LIST (QUOTE RPLACA)
␈↓ ↓⊗ (COND
␈↓ εK (CADR VAR)
␈↓ ↓⊗ ((ZEROP N)
␈↓ εK EXPR))
␈↓ ↓⊗ T)
␈↓ εK ((EQ (CAR VAR)
␈↓ ↓⊗ (T ('NTH X N])
␈↓ εK (QUOTE CDR))
␈↓ ↓⊗
␈↓ εK (LIST (QUOTE RPLACD)
␈↓ ↓⊗␈↓α('NTH␈↓↓
␈↓ εK (CADR VAR)
␈↓ ↓⊗ [LAMBDA (VAR LEN)
␈↓ εK EXPR))
␈↓ ↓⊗ (COND
␈↓ εK [(EQ (CAR VAR)
␈↓ ↓⊗ ((NOT (NUMBERP LEN))
␈↓ εK (QUOTE LDIFF))
␈↓ ↓⊗ (LIST (QUOTE NTH)
␈↓ εK ('REPLACE (CADR VAR)
␈↓ ↓⊗ VAR LEN))
␈↓ εK (LIST (QUOTE NCONC)
␈↓ ↓⊗ (T ('NTH{NUMBER⎇ VAR LEN])
␈↓ εK EXPR
␈↓ ↓⊗
␈↓ εK (CADDR VAR]
␈↓ ↓⊗␈↓α('NTH{NUMBER⎇␈↓↓
␈↓ εK (T (LIST (QUOTE RPLNODE)
␈↓ ↓⊗ [LAMBDA (VAR LEN)
␈↓ εK VAR EXPR])
␈↓ ↓⊗ (COND
␈↓ εK
␈↓ ↓⊗ ((EQ LEN 1)
␈↓ εK␈↓α('SETQ←SIDE←EFFECT␈↓↓
␈↓ ↓⊗ VAR)
␈↓ εK [LAMBDA (VAR VALUE LOCALORSETQFLG)
␈↓ ↓⊗ ((EQ LEN 2)
␈↓ εK (COND
␈↓ ↓⊗ (LIST (QUOTE CDR)
␈↓ εK ((OR (NOT POSTPONE←SIDE←EFFECTS)
␈↓ ↓⊗ VAR))
␈↓ εK (LOCALPATVAR VAR))
␈↓ ↓⊗ ((EQ LEN 3)
␈↓ εK ('SETQ VAR VALUE (AND MUSTBEMATCH LOCALORSETQFLG)))
␈↓ ↓⊗ (LIST (QUOTE CDDR)
␈↓ εK (T (POSTPONE ('SETQ VAR VALUE))
␈↓ ↓⊗ VAR))
␈↓ εK T])
␈↓ ↓⊗ ((EQ LEN 4)
␈↓ εK
␈↓ ↓⊗ (LIST (QUOTE CDDDR)
␈↓ εK␈↓α('REPLACE←SIDE←EFFECT␈↓↓
␈↓ ↓⊗ VAR))
␈↓ εK [LAMBDA (VAR VALUE)
␈↓ ↓⊗ ((EQ LEN 5)
␈↓ εK (COND
␈↓ ↓⊗ (LIST (QUOTE CDDDDR)
␈↓ εK [POSTPONE←SIDE←EFFECTS
␈↓ ↓⊗ (COND
␈↓ εK ((EQ EXPR2 (CADR TEM))
␈↓ ↓⊗ [(SETQ TEM (EASYTORECOMPUTE VAR))
␈↓ εK TEM)
␈↓ ↓⊗ (COND
␈↓ εK ((AND (EQ (CAR EXPR2)
␈↓ ↓⊗ ((BOUNDVAR TEM)
␈↓ εK (QUOTE AND))
␈↓ ↓⊗ (POSTPONE ('REPLACE VAR VALUE))
␈↓ εK (EQ (CADR TEM)
␈↓ ↓⊗ T)
␈↓ εK (CADR EXPR2)))
␈↓ ↓⊗ (T (POSTPONE ('REPLACE (SUBST (SETQ TEM2 (MAKEVAR T))
␈↓ εK (RPLACA (CDR EXPR2)
␈↓ ↓⊗ TEM VAR)
␈↓ εK TEM)
␈↓ ↓⊗ VALUE))
␈↓ εK EXPR2]
␈↓ ↓⊗ ('SETQ TEM2 TEM]
␈↓ εK ((EQUAL EXPR1 EXPR2)
␈↓ ↓⊗ (T (PROG (TEM2 (TEM ('REPLACE VAR VALUE)))
␈↓ εK EXPR2)
␈↓ ↓⊗ (PROG1 ('SETQ (SETQ TEM2 (MAKEVAR T))
␈↓ εK ((EQ (CAR EXPR1)
␈↓ ↓⊗ (CADR TEM))
␈↓ εK (QUOTE PROGN))
␈↓ ↓⊗ (RPLACA (CDR TEM)
␈↓ εK (SETQ TEM (LAST EXPR1))
␈↓ ↓⊗ TEM2)
␈↓ εK (RPLACA TEM ('AND (CAR TEM)
␈↓ ↓⊗ (POSTPONE TEM]
␈↓ εK EXPR2))
␈↓ ↓⊗ (T ('REPLACE VAR VALUE])
␈↓ εK EXPR1)
␈↓ ↓⊗
␈↓ εK ((AND (EQ (CAR EXPR2)
␈↓ ↓⊗␈↓α('SETQ␈↓↓
␈↓ εK (QUOTE COND))
␈↓ ↓⊗ [LAMBDA (VAR EXPRESSION 'SETQ-ORSETQFLG)
␈↓ εK (NOT (CDDR EXPR2)))
␈↓ ↓⊗ (COND
␈↓ εK (RPLACA (CADR EXPR2)
␈↓ ↓⊗ ([NOT (AND VAR (LITATOM VAR)
␈↓ εK ('AND EXPR1 (CAADR EXPR2)))
␈↓ ↓⊗ (NOT (EQ VAR T]
␈↓ εK EXPR2)
␈↓ ↓⊗ (HELP (QUOTE "TRYING TO SET NON-VARIABLE")
␈↓ εK ((EQ (CAR EXPR1)
␈↓ ↓⊗ VAR)))
␈↓ εK (QUOTE COND))
␈↓ ↓⊗ (SETQ EXPRESSION (LIST (QUOTE SETQ)
␈↓ εK (PROG (TEM)
␈↓ ↓⊗ VAR EXPRESSION))
␈↓ εK (SETQ TEM (LAST (CADR EXPR1)))
␈↓ ↓⊗ (COND
␈↓ εK (RPLACA TEM ('AND (CAR TEM)
␈↓ ↓⊗ ('SETQ-ORSETQFLG (LIST (QUOTE OR)
␈↓ εK EXPR2))
␈↓ ↓⊗ EXPRESSION T))
␈↓ εK (RETURN EXPR1)))
␈↓ ↓⊗ (T EXPRESSION])
␈↓ εK ((AND (EQ (CAR EXPR2)
␈↓ ↓⊗
␈↓ εK (QUOTE OR))
␈↓ ↓⊗␈↓α('SETVAR␈↓↓
␈↓ εK (EQ (CADDR EXPR2)
␈↓ ↓⊗ [LAMBDA (VAR EXPR LOCALORSETQFLG)
␈↓ εK T))
␈↓ ↓⊗ (COND
␈↓ εK (LIST (QUOTE COND)
␈↓ ↓⊗ [(AND VAR (NOT (EQ VAR T)))
␈↓ εK (LIST EXPR1 (CADR EXPR2)
␈↓ ↓⊗ (COND
␈↓ εK T)))
␈↓ ↓⊗ ((AND POSTPONE←SIDE←EFFECTS
␈↓ εK [(EQ (CAR EXPR2)
␈↓ ↓⊗ (LOCALPATVAR VAR))
␈↓ εK (QUOTE PROGN))
␈↓ ↓⊗ ('SETQ VAR EXPR LOCALORSETQFLG))
␈↓ εK (LIST (QUOTE COND)
␈↓ ↓⊗ ((EASYTORECOMPUTE EXPR)
␈↓ εK (CONS EXPR1 (CDR EXPR2]
␈↓ ↓⊗ (POSTPONE ('SETQ VAR EXPR))
␈↓ εK [(EQ (CAR EXPR2)
␈↓ ↓⊗ EXPR)
␈↓ εK (QUOTE AND))
␈↓ ↓⊗ (T (PROG (TEM)
␈↓ εK (COND
␈↓ ↓⊗ [POSTPONE ('SETQ VAR (SETQ TEM (MAKEVAR T]
␈↓ εK ((EQ (CAR EXPR1)
␈↓ ↓⊗ ('SETQ TEM EXPR LOCALORSETQFLG]
␈↓ εK (QUOTE AND))
␈↓ ↓⊗ (T EXPR])
␈↓ εK (NCONC EXPR1 (CDR EXPR2)))
␈↓ ↓⊗
␈↓ εK (T (RPLACD EXPR2 (CONS EXPR1 (CDR EXPR2]
␈↓ ↓⊗␈↓α('SOME␈↓↓
␈↓ εK ((EQ (CAR EXPR1)
␈↓ ↓⊗ [LAMBDA (LST ARGS EXPR)
␈↓ εK (QUOTE AND))
␈↓ ↓⊗ (LIST (QUOTE SOME)
␈↓ εK (NCONC1 EXPR1 EXPR2))
␈↓ ↓⊗ LST
␈↓ εK (T (LIST (QUOTE AND)
␈↓ ↓⊗ (LIST (QUOTE FUNCTION)
␈↓ εK EXPR1 EXPR2])
␈↓ ↓⊗ (LIST (QUOTE LAMBDA)
␈↓ εK
␈↓ ↓⊗ ARGS EXPR])
␈↓ εK␈↓α('!AND␈↓↓
␈↓ ↓⊗
␈↓ εK [LAMBDA (EXPRLIST)
␈↓ ↓⊗␈↓α('AND␈↓↓
␈↓ εK (OPTIMIZEAND (CONS (QUOTE AND)
␈↓ ↓⊗ [LAMBDA (EXPR1 EXPR2)
␈↓ εK EXPRLIST])
␈↓ ↓⊗ (PROG (TEM)
␈↓ εK
␈↓ ↓⊗ (COND
␈↓ εK␈↓α(OPTIMIZEAND␈↓↓
␈↓ ↓⊗ ((EQ EXPR1 T)
␈↓ εK [LAMBDA (EXPRESSION)
␈↓ ↓⊗ EXPR2)
␈↓ εK
␈↓ ↓⊗ ((EQ EXPR2 T)
␈↓ εK (* NOTE: NEEDS TO BE ADDED -
␈↓ ↓⊗ EXPR1)
␈↓ εK ('AND $ !X← ('OR & 'T) $ !Y←}
␈↓ ↓⊗ [(AND [OR (AND (EQ (CAR EXPR1)
␈↓ εK ('OR & T) $) -
␈↓ ↓⊗ (QUOTE SETQ))
␈↓ εK -
␈↓ ↓⊗ (SETQ TEM EXPR1))
␈↓ εK GOES TO -
␈↓ ↓⊗ (AND (EQ (CAR EXPR1)
␈↓ εK -
␈↓ ↓⊗ (QUOTE OR))
␈↓ εK <'COND < (LDIFF VAR X) ! (MAPCAR
␈↓ ↓⊗ (EQ (CAADR EXPR1)
␈↓ εK (LDIFF X Y) 'CADR) <'AND !Y>>>)
␈↓ ↓⊗ (QUOTE SETQ))
␈↓ εK
␈↓ ↓⊗ (EQ (CADDR EXPR1)
␈↓ εK
␈↓ ↓⊗ T)
␈↓ εK (PROG ((LIS EXPRESSION))
␈↓ ↓⊗ (SETQ TEM (CADR EXPR1]
␈↓ εK LP (COND
␈↓ ↓⊗ (COND
␈↓ εK [(NULL (CDR LIS))
␈↓ ↓⊗ (RETURN (COND
␈↓ εK (T (LIST (QUOTE EQ)
␈↓ ↓⊗ ((CDDR EXPRESSION)
␈↓ εK VAR EXPRESSION])
␈↓ ↓⊗ EXPRESSION)
␈↓ εK
␈↓ ↓⊗ (T (CADR EXPRESSION]
␈↓ εK␈↓α('EQLENGTH␈↓↓
␈↓ ↓⊗ ((OR (NULL (CADR LIS))
␈↓ εK [LAMBDA (VAR LEN)
␈↓ ↓⊗ (EQ (CADR LIS)
␈↓ εK (COND
␈↓ ↓⊗ T))
␈↓ εK ((NOT NULLCHK)
␈↓ ↓⊗ (RPLACD LIS (CDDR LIS)))
␈↓ εK T)
␈↓ ↓⊗ [(NLISTP (CADR LIS))
␈↓ εK ((ZEROP LEN)
␈↓ ↓⊗ (RPLACD (CDR LIS)
␈↓ εK ('NOT VAR))
␈↓ ↓⊗ (DREMOVE (CADR LIS)
␈↓ εK [(EQ LEN 1)
␈↓ ↓⊗ (CDDR LIS]
␈↓ εK ('AND VAR ('NOT ('CDR VAR]
␈↓ ↓⊗ ((EQ (CAADR LIS)
␈↓ εK [(AND (NUMBERP LEN)
␈↓ ↓⊗ (QUOTE SETQ))
␈↓ εK (ILESSP LEN 5))
␈↓ ↓⊗ (DREMOVE (CADADR LIS)
␈↓ εK ('AND (SETQ VAR ('NTH VAR LEN))
␈↓ ↓⊗ (CDR LIS)))
␈↓ εK ('NULL ('CDR VAR]
␈↓ ↓⊗ ((EQ (CAADR LIS)
␈↓ εK (T ('EQ ('LENGTH VAR)
␈↓ ↓⊗ (QUOTE AND))
␈↓ εK LEN])
␈↓ ↓⊗ (RPLACD LIS (NCONC (CDADR LIS)
␈↓ εK
␈↓ ↓⊗ (CDDR LIS)))
␈↓ εK␈↓α('EQUAL␈↓↓
␈↓ ↓⊗ (GO LP)))
␈↓ εK [LAMBDA (VAR EXPRESSION)
␈↓ ↓⊗ (SETQ LIS (CDR LIS))
␈↓ εK (COND
␈↓ ↓⊗ (GO LP])
␈↓ εK ((NULL EXPRESSION)
␈↓ ↓⊗
␈↓ εK ('NOT VAR))
␈↓ ↓⊗␈↓α('CAR␈↓↓
␈↓ εK (T (LIST (COND
␈↓ ↓⊗ [LAMBDA (X)
␈↓ εK ([OR (SMALLP EXPRESSION)
␈↓ ↓⊗ (PROG [(TEM (FASSOC (CAR X)
␈↓ εK (AND (EQ (CAR EXPRESSION)
␈↓ ↓⊗ (QUOTE ((CAR . CAAR)
␈↓ εK (QUOTE QUOTE))
␈↓ ↓⊗ (CDR . CADR)
␈↓ εK (OR (SMALLP (CADR EXPRESSION))
␈↓ ↓⊗ (CAAR . CAAAR)
␈↓ εK (LITATOM (CADR EXPRESSION]
␈↓ ↓⊗ (CADR . CAADR)
␈↓ εK (QUOTE EQ))
␈↓ ↓⊗ (CDAR . CADAR)
␈↓ εK ((NUMBERP EXPRESSION)
␈↓ ↓⊗ (CDDR . CADDR)
␈↓ εK (QUOTE EQP))
␈↓ ↓⊗ (CAAAR . CAAAAR)
␈↓ εK (T (QUOTE EQUAL)))
␈↓ ↓⊗ (CAADR . CAAADR)
␈↓ εK VAR EXPRESSION])
␈↓ ↓⊗ (CADAR . CAADAR)
␈↓ εK
␈↓ ↓⊗ (CADDR . CAADDR)
␈↓ εK␈↓α('LENGTH␈↓↓
␈↓ ↓⊗ (CDAAR . CADAAR)
␈↓ εK [LAMBDA (EXPR)
␈↓ ↓⊗ (CDADR . CADADR)
␈↓ εK (LIST (QUOTE LENGTH)
␈↓ ↓⊗ (CDDAR . CADDAR)
␈↓ εK EXPR])
␈↓ ↓⊗ (CDDDR . CADDDR]
␈↓ εK
␈↓ ↓⊗ (COND
␈↓ εK␈↓α('LISTP␈↓↓
␈↓ ↓⊗ (TEM (LIST (CDR TEM)
␈↓ εK [LAMBDA (X)
␈↓ ↓⊗ (CADR X)))
␈↓ εK (LIST (QUOTE LISTP)
␈↓ ↓⊗ (T (LIST (QUOTE CAR)
␈↓ εK X])
␈↓ ↓⊗ X])
␈↓ εK
␈↓ ↓⊗
␈↓ εK␈↓α('NULL␈↓↓
␈↓ ↓⊗␈↓α('CDR␈↓↓
␈↓ εK [LAMBDA (X)
␈↓ ↓⊗ [LAMBDA (X)
␈↓ εK (COND
␈↓ ↓⊗ (PROG [(TEM (FASSOC (CAR X)
␈↓ εK ((FMEMB (CAR X)
␈↓ ↓⊗ (QUOTE ((CAR . CDAR)
␈↓ εK (QUOTE (NOT NULL)))
␈↓ ↓⊗ (CDR . CDDR)
␈↓ εK (CADR X))
␈↓ ↓⊗ (CAAR . CDAAR)
␈↓ εK (T (LIST (QUOTE NULL)
␈↓ ↓⊗ (CADR . CDADR)
␈↓ εK X])
␈↓ ↓⊗ (CDAR . CDDAR)
␈↓ εK
␈↓ ↓⊗ (CDDR . CDDDR)
␈↓ εK␈↓α('LAST␈↓↓
␈↓ ↓⊗ (CAAAR . CDAAAR)
␈↓ εK [LAMBDA (X)
␈↓ ↓⊗ (CAADR . CDAADR)
␈↓ εK (LIST (QUOTE LAST)
␈↓ ↓⊗ (CADAR . CDADAR)
␈↓ εK X])
␈↓ ↓⊗ (CADDR . CDADDR)
␈↓ εK
␈↓ ↓⊗ (CDAAR . CDDAAR)
␈↓ εK␈↓α('TAILP␈↓↓
␈↓ ↓⊗ (CDADR . CDDADR)
␈↓ εK [LAMBDA (X Y)
␈↓ ↓⊗ (CDDAR . CDDDAR)
␈↓ εK (LIST (QUOTE TAILP)
␈↓ ↓⊗ (CDDDR . CDDDDR]
␈↓ εK X Y])
␈↓ ↓⊗ (COND
␈↓ εK
␈↓ ↓⊗ (TEM (LIST (CDR TEM)
␈↓ εK␈↓α('LDIFF␈↓↓
␈↓ ↓⊗ (CADR X)))
␈↓ εK [LAMBDA (A B)
␈↓ ↓⊗ (T (LIST (QUOTE CDR)
␈↓ εK (LIST (QUOTE LDIFF)
␈↓ ↓⊗ X])
␈↓ εK A B])
␈↓ ↓⊗
␈↓ εK
␈↓ ↓⊗␈↓α('EQ␈↓↓
␈↓ εK␈↓α('RETURN␈↓↓
␈↓ ↓⊗ [LAMBDA (VAR EXPRESSION)
␈↓ εK [LAMBDA (VALUE)
␈↓ ↓⊗ (COND
␈↓ εK (COND
␈↓ ↓⊗ ((NULL EXPRESSION)
␈↓ εK ((AND (NOT MUSTBEMATCH)
␈↓ ↓⊗ ('NULL VAR))
␈↓ εK (NULL POSTPONEDEFFECTS))
␈↓ ↓⊗ VALUE)
␈↓ εK
␈↓ ↓⊗ ((BOUNDVAR (PROG [(EASYFNS (QUOTE (CAR CDR SETQ]
␈↓ εK
␈↓ ↓⊗ (EASYTORECOMPUTE VALUE)))
␈↓ εK (PATPARSE← (CDR PAT))
␈↓ ↓⊗ (SETQ MUSTRETURN (RECOMPUTATION VALUE))
␈↓ εK (* And then "BI" CAR &
␈↓ ↓⊗ T)
␈↓ εK CDR PAT)
␈↓ ↓⊗ (T (BIND (SETQ MUSTRETURN (GENSYML VALUE)))
␈↓ εK (BI12 PAT))
␈↓ ↓⊗ ('SETQ MUSTRETURN VALUE ORSETQFLG])
␈↓ εK [$ (PATPARSE← (CDR PAT))
␈↓ ↓⊗)
␈↓ εK (COND
␈↓ ↓⊗␈↓α(DEFINEQ␈↓↓
␈↓ εK ((EQ (CADR PAT)
␈↓ ↓⊗
␈↓ εK (QUOTE 1))
␈↓ ↓⊗␈↓α(PARSE␈↓↓
␈↓ εK (RPLACA PAT (QUOTE $1))
␈↓ ↓⊗ [LAMBDA (X)
␈↓ εK (RPLACD PAT (CDDR PAT)))
␈↓ ↓⊗ (PATPARSE (COPY X])
␈↓ εK ((SMALLP (CADR PAT))
␈↓ ↓⊗
␈↓ εK (BI12 PAT)
␈↓ ↓⊗␈↓α(PATPARSE␈↓↓
␈↓ εK (RPLACA (CAR PAT)
␈↓ ↓⊗ [LAMBDA (PAT)
␈↓ εK (QUOTE $$]
␈↓ ↓⊗ (PROG (NUMLIST)
␈↓ εK (' (* NO ←'S ALLOWED OR
␈↓ ↓⊗
␈↓ εK CHECKED FOR)
␈↓ ↓⊗ (* NUMLIST is a list of the #'s that have been found
␈↓ εK (BI12 PAT))
␈↓ ↓⊗ -
␈↓ εK (%. (RPLACA PAT (QUOTE !)))
␈↓ ↓⊗ For every # that is found, an entry is added to
␈↓ εK ((& $1 ≠1 * ! --)
␈↓ ↓⊗ NUMLIST which is (NUMBER %. Pattern where the NUMBER
␈↓ εK (* These are all ok -
␈↓ ↓⊗ occured) so that later, NUMPATPARSE can go back and
␈↓ εK ! will be handled later)
␈↓ ↓⊗ change the numbered item to
␈↓ εK T)
␈↓ ↓⊗ (← (## . I) item) and thus, the thing can be saved.
␈↓ εK [←(COND
␈↓ ↓⊗ In MAKEMATCH, the thing-that-matched item will
␈↓ εK ((NOT BACKPAT)
␈↓ ↓⊗ either be bound to a variable, or passed along)
␈↓ εK (PATPARSE1 (CDDR PAT))
␈↓ ↓⊗
␈↓ εK (RETURN PAT]
␈↓ ↓⊗
␈↓ εK (COND
␈↓ ↓⊗ (SETQ PAT (PATPARSE1 PAT))
␈↓ εK [(STRINGP (CAR PAT))
␈↓ ↓⊗ (COND
␈↓ εK (RPLACA PAT (CONS (QUOTE ')
␈↓ ↓⊗ (NUMLIST (NUMPATPARSE NUMLIST)))
␈↓ εK (MKATOM (CAR PAT]
␈↓ ↓⊗ (RETURN PAT])
␈↓ εK ((AND (STRPOSL (QUOTE (! ' ≠ & - # ← = $
␈↓ ↓⊗
␈↓ εK :))
␈↓ ↓⊗␈↓α(NUMPATPARSE␈↓↓
␈↓ εK (CAR PAT)
␈↓ ↓⊗ [LAMBDA (PAT NUMLIST)
␈↓ εK 1)
␈↓ ↓⊗ (OR (NOT NUMLIST)
␈↓ εK (PATPARSEAT (DUNPACK (CAR PAT)
␈↓ ↓⊗ (HELP (QUOTE "NUMBERS NOT DONE YET")
␈↓ εK SKORLST2)
␈↓ ↓⊗ PAT])
␈↓ εK PAT))
␈↓ ↓⊗
␈↓ εK (* Otherwise, BREAK up
␈↓ ↓⊗␈↓α(PATPARSE1␈↓↓
␈↓ εK CAR PAT and try to
␈↓ ↓⊗ [LAMBDA (PAT BACKPAT)
␈↓ εK PATPARSEAT it)
␈↓ ↓⊗
␈↓ εK (GO RETRY))
␈↓ ↓⊗ (* Smashes PAT with it's parsing;
␈↓ εK (T (* Must have a variable
␈↓ ↓⊗ BACKPAT is used when there is a ← to determine if
␈↓ εK here!)
␈↓ ↓⊗ the previous thing was a !, a variable, or a pattern
␈↓ εK (SETQ TEM (QUOTE VAR]
␈↓ ↓⊗ -
␈↓ εK ((EQ (CAAR PAT)
␈↓ ↓⊗ If it was VAR or !, leave it alone -
␈↓ εK (QUOTE ANY))
␈↓ ↓⊗ If it was a pattern, then don't PATPARSE the next
␈↓ εK (PATPARSE1 (CDAR PAT)))
␈↓ ↓⊗ thing, since it's an EXPRESSION -
␈↓ εK (T (* Otherwise, all there
␈↓ ↓⊗ In the first two cases, BACKPAT should be T;
␈↓ εK is is a subpattern)
␈↓ ↓⊗ otherwise, it should be the previous thing)
␈↓ εK (PATPARSE1 (CAR PAT]
␈↓ ↓⊗
␈↓ εK [AND (CDR PAT)
␈↓ ↓⊗
␈↓ εK (NLISTP (CDR PAT))
␈↓ ↓⊗ (AND PAT
␈↓ εK (RPLACD PAT (LIST (QUOTE !)
␈↓ ↓⊗ (PROG (TEM)
␈↓ εK (CDR PAT]
␈↓ ↓⊗ RETRY
␈↓ εK (PATPARSE1 (CDR PAT)
␈↓ ↓⊗ [COND
␈↓ εK TEM)
␈↓ ↓⊗ [(NLISTP (CAR PAT))
␈↓ εK [COND
␈↓ ↓⊗ (SELECTQ (CAR PAT)
␈↓ εK [(EQ (CADR PAT)
␈↓ ↓⊗ ((= == : $$)
␈↓ εK (QUOTE ←))
␈↓ ↓⊗
␈↓ εK (COND
␈↓ ↓⊗ (* Look for ←'s in (CADR PAT) and spread it out if
␈↓ εK ((EQ (CAR PAT)
␈↓ ↓⊗ so -
␈↓ εK (QUOTE !)) (* Got (!←expr ...)
␈↓ ↓⊗ This might want to change later -
␈↓ εK change it to
␈↓ ↓⊗ (= foo←fie ...) -
␈↓ εK ((! ← . expr) ...))
␈↓ ↓⊗ (=foo ←fie ...) -
␈↓ εK (RPLACD PAT (CDDR PAT))
␈↓ ↓⊗ (=foo←fie ...) -
␈↓ εK (RPLACA PAT (QUOTE !->))
␈↓ ↓⊗ The second case is not ambiguous, but the first is -
␈↓ εK (BI12 PAT))
␈↓ ↓⊗ it's possible to handle it just like the QUOTE -
␈↓ εK [(EQ TEM (QUOTE VAR))
␈↓ ↓⊗ Never split -
␈↓ εK
␈↓ ↓⊗ Or leave it to PATPARSEAT never to split after an
␈↓ εK (* Got (VAR ← PAT ...); change it to
␈↓ ↓⊗ equal -
␈↓ εK ((← VAR . PAT) ...))
␈↓ ↓⊗ Also, need it for the (admittedly rare) case of #
␈↓ εK
␈↓ ↓⊗ 1←foo)
␈↓ εK
␈↓ ↓⊗ (COND
␈↓ εK (EQ (CADR TAIL)
␈↓ ↓⊗ ((CDDR PAT)
␈↓ εK (QUOTE =)))
␈↓ ↓⊗ (BISET PAT))
␈↓ εK (SETQ AT (QUOTE ==))
␈↓ ↓⊗ (T (HELP "NOTHING AFTER A '←' IN A PATTERN"
␈↓ εK (CDDR TAIL))
␈↓ ↓⊗ TOPPAT]
␈↓ εK ([AND (EQ (CAR TAIL)
␈↓ ↓⊗ (T
␈↓ εK (QUOTE $))
␈↓ ↓⊗
␈↓ εK (EQ (CADR TAIL)
␈↓ ↓⊗ (* Otherwise, there is a (PAT ← EXPR ...); change it
␈↓ εK 1)
␈↓ ↓⊗ to (-> expr . PAT))
␈↓ εK (NOT (SMALLP (CADDR TAIL]
␈↓ ↓⊗
␈↓ εK (* $1's are parsed as an
␈↓ ↓⊗
␈↓ εK atom)
␈↓ ↓⊗ (BIRPLAC PAT]
␈↓ εK (SETQ AT (QUOTE $1))
␈↓ ↓⊗ [(EQ (CAR PAT)
␈↓ εK (CDDR TAIL))
␈↓ ↓⊗ (QUOTE !))
␈↓ εK ((AND (EQ (CAR TAIL)
␈↓ ↓⊗ (COND
␈↓ εK (QUOTE $))
␈↓ ↓⊗ ((EQ (CAADR PAT)
␈↓ εK (EQ (CADR TAIL)
␈↓ ↓⊗ (QUOTE DEFAULT))
␈↓ εK (QUOTE $)))
␈↓ ↓⊗ (MAKE!DEFAULT PAT))
␈↓ εK (SETQ AT (QUOTE $$))
␈↓ ↓⊗ [(EQ (CAADR PAT)
␈↓ εK (CDDR TAIL))
␈↓ ↓⊗ (QUOTE ←))
␈↓ εK (T (CDR TAIL]
␈↓ ↓⊗ [RPLACA PAT (CONS (QUOTE !←)
␈↓ εK (COND
␈↓ ↓⊗ (CADR (CADR PAT]
␈↓ εK (REST (PATPARSEAT REST PAT T)
␈↓ ↓⊗ (RPLACA (CDR PAT)
␈↓ εK (ATTACH AT PAT))
␈↓ ↓⊗ (CDDR (CADR PAT]
␈↓ εK (T (RPLACA PAT AT)))
␈↓ ↓⊗ (T (BI12 PAT]
␈↓ εK (AND (NOT (EQ TAIL UNPACKEDAT))
␈↓ ↓⊗ ((EQ TEM (QUOTE VAR))
␈↓ εK (ATTACH (PACKLDIFF UNPACKEDAT TAIL)
␈↓ ↓⊗ (RPLACA PAT (CONS (QUOTE DEFAULT)
␈↓ εK PAT))
␈↓ ↓⊗ (CAR PAT]
␈↓ εK PAT)
␈↓ ↓⊗ (RETURN PAT])
␈↓ εK (FLG (RPLACA PAT (PACK UNPACKEDAT])
␈↓ ↓⊗
␈↓ εK
␈↓ ↓⊗␈↓α(PATPARSE←␈↓↓
␈↓ εK␈↓α(PACKLDIFF␈↓↓
␈↓ ↓⊗ [LAMBDA (PAT) (* Look for ←'s in
␈↓ εK [LAMBDA (L TAIL)
␈↓ ↓⊗ (CAR PAT))
␈↓ εK (PROG (TEM)
␈↓ ↓⊗ (AND (LITATOM (CAR PAT))
␈↓ εK (AND (SETQ TEM (NLEFT L 1 TAIL))
␈↓ ↓⊗ (PATPARSEAT (DUNPACK (CAR PAT)
␈↓ εK (RPLACD TEM)
␈↓ ↓⊗ SKORLST2)
␈↓ εK (PROG1 (PACK L)
␈↓ ↓⊗ PAT
␈↓ εK (RPLACD TEM TAIL])
␈↓ ↓⊗ (QUOTE (←])
␈↓ εK
␈↓ ↓⊗
␈↓ εK␈↓α(BISET␈↓↓
␈↓ ↓⊗␈↓α(BI12␈↓↓
␈↓ εK [LAMBDA (PAT)
␈↓ ↓⊗ [LAMBDA (PAT) (* This changes
␈↓ εK
␈↓ ↓⊗ (A B ...) to
␈↓ εK (* This function changes (a b c ...) to
␈↓ ↓⊗ ((A . B) ...))
␈↓ εK ((b a . c) ...))
␈↓ ↓⊗ (COND
␈↓ εK
␈↓ ↓⊗ ((OR (NLISTP PAT)
␈↓ εK
␈↓ ↓⊗ (NLISTP (CDR PAT)))
␈↓ εK (PROG ((TEM (CDR PAT)))
␈↓ ↓⊗ (ERROR "BAD ARG TO BI12" PAT)))
␈↓ εK (RPLACD PAT (CDDDR PAT))
␈↓ ↓⊗ (PROG ((TEM (CDR PAT)))
␈↓ εK (RPLACD (CDR TEM)
␈↓ ↓⊗ (RPLACD PAT (CDDR PAT))
␈↓ εK (CADR TEM))
␈↓ ↓⊗ (RPLACD TEM (CAR TEM))
␈↓ εK (RPLACA (CDR TEM)
␈↓ ↓⊗ (RPLACA TEM (CAR PAT))
␈↓ εK (CAR PAT))
␈↓ ↓⊗ (RPLACA PAT TEM])
␈↓ εK (RPLACA PAT TEM])
␈↓ ↓⊗
␈↓ εK
␈↓ ↓⊗␈↓α(PATPARSEAT␈↓↓
␈↓ εK␈↓α(BIRPLAC␈↓↓
␈↓ ↓⊗ [LAMBDA (UNPACKEDAT PAT FLG)
␈↓ εK [LAMBDA (PAT)
␈↓ ↓⊗
␈↓ εK (PROG ((TEM (CAR PAT)))
␈↓ ↓⊗ (* Parses (CAR PAT) which has been unpacked into
␈↓ εK (RPLACA PAT (CDR PAT))
␈↓ ↓⊗ UNPACKEDAT and replaces the parsing into
␈↓ εK (RPLACD PAT (CDDDR PAT))
␈↓ ↓⊗ (CAR PAT); otherwise return if can't -
␈↓ εK (RPLACD (CDAR PAT)
␈↓ ↓⊗ Unless flg is on, meaning always smash
␈↓ εK TEM)
␈↓ ↓⊗ (CAR PAT))
␈↓ εK (RPLACA (CAR PAT)
␈↓ ↓⊗
␈↓ εK (QUOTE ->])
␈↓ ↓⊗
␈↓ εK
␈↓ ↓⊗ (PROG (TAIL AT REST)
␈↓ εK␈↓α(MAKEDEFAULT␈↓↓
␈↓ ↓⊗ (RETURN (COND
␈↓ εK [LAMBDA (PATELT)
␈↓ ↓⊗ ([SETQ TAIL
␈↓ εK
␈↓ ↓⊗ (SOME UNPACKEDAT
␈↓ εK (* Turns PATELT (which is either NLISTP, or
␈↓ ↓⊗ (FUNCTION (LAMBDA (CHR)
␈↓ εK (default . atom), into the "DEFAULT" pattern -
␈↓ ↓⊗ (FMEMB CHR
␈↓ εK I.e. PATELT couldn't be parsed as a pattern -
␈↓ ↓⊗ (QUOTE (' = ← * $ # %.
␈↓ εK It is assumed that the default for an atom is an
␈↓ ↓⊗ ! ' :]
␈↓ εK element pattern))
␈↓ ↓⊗ (SETQ AT (CAR TAIL))
␈↓ εK
␈↓ ↓⊗ [SETQ REST (COND
␈↓ εK
␈↓ ↓⊗ ((AND (EQ (CAR TAIL)
␈↓ εK (COND
␈↓ ↓⊗ (QUOTE =))
␈↓ εK [(EQ (CAR PATELT)
␈↓ ↓⊗ (QUOTE DEFAULT))
␈↓ εK (GO LP])
␈↓ ↓⊗ (SELECTQ VARDEFAULT
␈↓ εK)
␈↓ ↓⊗ [(← SETQ SET)
␈↓ εK (RPAQQ POSTPONE←SIDE←EFFECTS T)
␈↓ ↓⊗ (COND
␈↓ εK (RPAQQ VARDEFAULT SET)
␈↓ ↓⊗ ([OR (FMEMB (CDR PATELT)
␈↓ εK (RPAQQ LISTPCHK NIL)
␈↓ ↓⊗ (QUOTE (NIL T)))
␈↓ εK (RPAQQ ORSETQFLG T)
␈↓ ↓⊗ (NOT (LITATOM (CDR PATELT]
␈↓ εK [RPAQQ MATCHBLOCKS
␈↓ ↓⊗ (FRPLACA PATELT (QUOTE ')))
␈↓ εK ((MATCHBLOCK MAKEMATCH 'MATCHTOP 'MATCH 'MATCHBIND 'MATCHELT
␈↓ ↓⊗ (T (FRPLACA (FRPLACD PATELT (CONS (CDR PATELT)
␈↓ εK 'MATCHEXP 'MATCHFIXED 'MATCHSUBPAT 'MATCHTAIL
␈↓ ↓⊗ (QUOTE $1)))
␈↓ εK 'MATCHSOME 'MATCHWITHMEMB 'MATCHNNIL 'MATCHEXP1
␈↓ ↓⊗ (QUOTE ←]
␈↓ εK LOCALPATVAR 'MATCH&SET 'CDRLEN POSTPONE
␈↓ ↓⊗ ((QUOTE ')
␈↓ εK NOMATCHELT? 'HEADP ANALPATELT ANALPAT MAXANAL
␈↓ ↓⊗ (FRPLACA PATELT (QUOTE ')))
␈↓ εK ANAL!PAT ABP $? SKIP$I SKIP$ SKIP$ANY ELT?
␈↓ ↓⊗ ((= EQUAL)
␈↓ εK MEMBPAT? ARB? NOMATCHARB? SUBPAT? NOMATCHARBCAR?
␈↓ ↓⊗ (FRPLACA PATELT (QUOTE =)))
␈↓ εK NULLPAT? CANMATCHNIL EASYTORECOMPUTE EQTOMEMB
␈↓ ↓⊗ (HELP (QUOTE "FUNNY VARDEFAULT"]
␈↓ εK FULLEXPANSION GENSYML MAKESUBST MAKESUBST1
␈↓ ↓⊗ (T (SELECTQ VARDEFAULT
␈↓ εK FORMEXPAND BIND BOUNDVAR RECOMPUTATION MAKEVAR
␈↓ ↓⊗ [(← SETQ SET)
␈↓ εK 'NLEFT 'NOT 'NOTLESSPLENGTH 'NTH 'NTH{NUMBER⎇ 'OR
␈↓ ↓⊗ (CONS (QUOTE ←)
␈↓ εK 'PLUS 'REPLACE 'SETQ←SIDE←EFFECT
␈↓ ↓⊗ (CONS PATELT (QUOTE $1]
␈↓ εK 'REPLACE←SIDE←EFFECT 'SETQ 'SETVAR 'SOME 'AND
␈↓ ↓⊗ ((QUOTE ')
␈↓ εK '!AND OPTIMIZEAND 'CAR 'CDR 'EQ 'EQLENGTH 'EQUAL
␈↓ ↓⊗ (CONS (QUOTE ')
␈↓ εK 'LENGTH 'LISTP 'NULL 'LAST 'TAILP 'LDIFF 'RETURN
␈↓ ↓⊗ PATELT))
␈↓ εK PARSE PATPARSE NUMPATPARSE PATPARSE1 PATPARSE←
␈↓ ↓⊗ ((= EQUAL)
␈↓ εK BI12 PATPARSEAT PACKLDIFF BISET BIRPLAC
␈↓ ↓⊗ (CONS (QUOTE =)
␈↓ εK MAKEDEFAULT MAKE!DEFAULT
␈↓ ↓⊗ PATELT))
␈↓ εK (BLKAPPLYFNS ANALPATELT ANAL!PAT 'MATCH
␈↓ ↓⊗ (HELP (QUOTE "FUNNY VARDEFAULT"])
␈↓ εK 'MATCHNNIL 'MATCHFIXED 'MATCHEXP
␈↓ ↓⊗
␈↓ εK 'CDRLEN)
␈↓ ↓⊗␈↓α(MAKE!DEFAULT␈↓↓
␈↓ εK (ENTRIES MAKEMATCH)
␈↓ ↓⊗ [LAMBDA (PAT)
␈↓ εK (GLOBALVARS VARDEFAULT LISTPCHK ORSETQFLG
␈↓ ↓⊗ (SELECTQ VARDEFAULT
␈↓ εK POSTPONE←SIDE←EFFECTS)
␈↓ ↓⊗ ((← SETQ SET)
␈↓ εK (LOCALFREEVARS TAIL TEM ISVALUE EASYFNS BINDINGS
␈↓ ↓⊗ [FRPLACA PAT (CONS (QUOTE ←)
␈↓ εK MUSTBEMATCH POSTPONEDEFFECTS
␈↓ ↓⊗ (CONS (CDR (CADR PAT))
␈↓ εK MUSTRETURN SOMEVARS GENSYMVARSLIST
␈↓ ↓⊗ (QUOTE $]
␈↓ εK MAKESUBSTVARLIST MATCH SETS
␈↓ ↓⊗ (FRPLACD PAT (CDDR PAT)))
␈↓ εK NULLCHK TOPPAT FOUNDBEFORE LEN
␈↓ ↓⊗ ((QUOTE ')
␈↓ εK GENSYMVARLIST OLD NEW SAVNEW TEM2]
␈↓ ↓⊗ (FRPLACA (CADR PAT)
␈↓ εK␈↓α(DECLARE␈↓↓
␈↓ ↓⊗ (QUOTE '))
␈↓ εK (BLOCK: MATCHBLOCK MAKEMATCH 'MATCHTOP 'MATCH 'MATCHBIND 'MATCHELT
␈↓ ↓⊗ (BI12 PAT))
␈↓ εK 'MATCHEXP 'MATCHFIXED 'MATCHSUBPAT 'MATCHTAIL 'MATCHSOME
␈↓ ↓⊗ ((= EQUAL)
␈↓ εK 'MATCHWITHMEMB 'MATCHNNIL 'MATCHEXP1 LOCALPATVAR 'MATCH&SET
␈↓ ↓⊗ (FRPLACA (CADR PAT)
␈↓ εK 'CDRLEN POSTPONE NOMATCHELT? 'HEADP ANALPATELT ANALPAT
␈↓ ↓⊗ (QUOTE =))
␈↓ εK MAXANAL ANAL!PAT ABP $? SKIP$I SKIP$ SKIP$ANY ELT? MEMBPAT?
␈↓ ↓⊗ (BI12 PAT))
␈↓ εK ARB? NOMATCHARB? SUBPAT? NOMATCHARBCAR? NULLPAT? CANMATCHNIL
␈↓ ↓⊗ (HELP (QUOTE "FUNNY VARDEFAULT"])
␈↓ εK EASYTORECOMPUTE EQTOMEMB FULLEXPANSION GENSYML MAKESUBST
␈↓ ↓⊗)
␈↓ εK MAKESUBST1 FORMEXPAND BIND BOUNDVAR RECOMPUTATION MAKEVAR
␈↓ ↓⊗␈↓α(DEFINEQ␈↓↓
␈↓ εK 'NLEFT 'NOT 'NOTLESSPLENGTH 'NTH 'NTH{NUMBER⎇ 'OR 'PLUS
␈↓ ↓⊗
␈↓ εK 'REPLACE 'SETQ←SIDE←EFFECT 'REPLACE←SIDE←EFFECT 'SETQ 'SETVAR
␈↓ ↓⊗␈↓α(HEADP␈↓↓
␈↓ εK 'SOME 'AND '!AND OPTIMIZEAND 'CAR 'CDR 'EQ 'EQLENGTH 'EQUAL
␈↓ ↓⊗ [LAMBDA (A B)
␈↓ εK 'LENGTH 'LISTP 'NULL 'LAST 'TAILP 'LDIFF 'RETURN PARSE
␈↓ ↓⊗ (PROG NIL
␈↓ εK PATPARSE NUMPATPARSE PATPARSE1 PATPARSE← BI12 PATPARSEAT
␈↓ ↓⊗ LP (COND
␈↓ εK PACKLDIFF BISET BIRPLAC MAKEDEFAULT MAKE!DEFAULT
␈↓ ↓⊗ ((NULL A)
␈↓ εK (BLKAPPLYFNS ANALPATELT ANAL!PAT 'MATCH 'MATCHNNIL
␈↓ ↓⊗ (RETURN (OR B T)))
␈↓ εK 'MATCHFIXED 'MATCHEXP 'CDRLEN)
␈↓ ↓⊗ ((NLISTP A)
␈↓ εK (ENTRIES MAKEMATCH)
␈↓ ↓⊗ (RETURN (EQ A B)))
␈↓ εK (GLOBALVARS VARDEFAULT LISTPCHK ORSETQFLG
␈↓ ↓⊗ ([OR (NLISTP B)
␈↓ εK POSTPONE←SIDE←EFFECTS)
␈↓ ↓⊗ (NOT (EQUAL (CAR A)
␈↓ εK (LOCALFREEVARS TAIL TEM ISVALUE EASYFNS BINDINGS MUSTBEMATCH
␈↓ ↓⊗ (CAR B]
␈↓ εK POSTPONEDEFFECTS MUSTRETURN SOMEVARS
␈↓ ↓⊗ (RETURN NIL)))
␈↓ εK GENSYMVARSLIST MAKESUBSTVARLIST MATCH SETS
␈↓ ↓⊗ (SETQ A (CDR A))
␈↓ εK NULLCHK TOPPAT FOUNDBEFORE LEN GENSYMVARLIST
␈↓ ↓⊗ (SETQ B (CDR B))
␈↓ εK OLD NEW SAVNEW TEM2))
␈↓ ↓⊗␈↓ εK)(DEFLIST(QUOTE(
␈↓ ↓⊗␈↓ εK [EVERY
␈↓ ↓⊗␈↓ εK (X
␈↓ ↓⊗␈↓ εK (PROG
␈↓ ↓⊗␈↓ εK (LL Q)
␈↓ ↓⊗␈↓ εK (RETURN
␈↓ ↓⊗␈↓ εK (SUBPAIR
␈↓ ↓⊗␈↓ εK (QUOTE (MAPX MAPCF MAPCF2 B))
␈↓ ↓⊗␈↓ εK (LIST
␈↓ ↓⊗␈↓ εK (CAR X)
␈↓ ↓⊗␈↓ εK [COND [(SETQ Q (CFNP (CADR X)))
␈↓ ↓⊗␈↓ εK (CONS Q (QUOTE ((CAR MACROX)
␈↓ ↓⊗␈↓ εK MACROX]
␈↓ ↓⊗ (T [SETQ LL (CONS (LIST (QUOTE MACROF)
␈↓ ↓⊗ (CADR X]
␈↓ ↓⊗ (QUOTE (APPLY* MACROF (CAR MACROX)
␈↓ ↓⊗ MACROX]
␈↓ ↓⊗ [COND
␈↓ ↓⊗ [(CDDR X)
␈↓ ↓⊗ (COND
␈↓ ↓⊗ [(SETQ Q (CFNP (CADDR X)))
␈↓ ↓⊗ (CONS Q (QUOTE (MACROX]
␈↓ ↓⊗ (T (SETQ LL
␈↓ ↓⊗ (CONS [LIST (QUOTE MACROF2)
␈↓ ↓⊗ (LIST (QUOTE OR)
␈↓ ↓⊗ (CADDR X)
␈↓ ↓⊗ (QUOTE (QUOTE CDR]
␈↓ ↓⊗ LL))
␈↓ ↓⊗ (QUOTE (APPLY* MACROF2 MACROX]
␈↓ ↓⊗ (T (QUOTE (CDR MACROX]
␈↓ ↓⊗ LL)
␈↓ ↓⊗ (QUOTE (PROG ((MACROX MAPX) . B)
␈↓ ↓⊗ MAPCLP
␈↓ ↓⊗ (COND ((NLISTP MACROX)
␈↓ ↓⊗ (RETURN T))
␈↓ ↓⊗ ((NOT MAPCF)
␈↓ ↓⊗ (RETURN NIL)))
␈↓ ↓⊗ (SETQ MACROX MAPCF2)
␈↓ ↓⊗ (GO MAPCLP]
␈↓ ↓⊗ [SOME
␈↓ ↓⊗ (X
␈↓ ↓⊗ (PROG
␈↓ ↓⊗ (LL Q)
␈↓ ↓⊗ (RETURN
␈↓ ↓⊗ (SUBPAIR
␈↓ ↓⊗ (QUOTE (MAPX MAPCF MAPCF2 B))
␈↓ ↓⊗ (LIST
␈↓ ↓⊗ (CAR X)
␈↓ ↓⊗ [COND [(SETQ Q (CFNP (CADR X)))
␈↓ ↓⊗ (CONS Q (QUOTE ((CAR MACROX)
␈↓ ↓⊗ MACROX]
␈↓ ↓⊗ (T [SETQ LL (CONS (LIST (QUOTE MACROF)
␈↓ ↓⊗ (CADR X]
␈↓ ↓⊗ (QUOTE (APPLY* MACROF (CAR MACROX)
␈↓ ↓⊗ MACROX]
␈↓ ↓⊗ [COND
␈↓ ↓⊗ [(CDDR X)
␈↓ ↓⊗ (COND
␈↓ ↓⊗ [(SETQ Q (CFNP (CADDR X)))
␈↓ ↓⊗ (CONS Q (QUOTE (MACROX]
␈↓ ↓⊗ (T (SETQ LL
␈↓ ↓⊗ (CONS [LIST (QUOTE MACROF2)
␈↓ ↓⊗ (LIST (QUOTE OR)
␈↓ ↓⊗ (CADDR X)
␈↓ ↓⊗ (QUOTE (QUOTE CDR]
␈↓ ↓⊗ LL))
␈↓ ↓⊗ (QUOTE (APPLY* MACROF2 MACROX]
␈↓ ↓⊗ (T (QUOTE (CDR MACROX]
␈↓ ↓⊗ LL)
␈↓ ↓⊗ (QUOTE (PROG ((MACROX MAPX) . B)
␈↓ ↓⊗ MAPCLP
␈↓ ↓⊗ (COND ((NLISTP MACROX)
␈↓ ↓⊗ (RETURN NIL))
␈↓ ↓⊗ (MAPCF (RETURN MACROX)))
␈↓ ↓⊗ (SETQ MACROX MAPCF2)
␈↓ ↓⊗ (GO MAPCLP]
␈↓ ↓⊗))(QUOTE MACRO))
␈↓ ↓⊗
␈↓ ↓⊗STOP
␈↓ ↓⊗
␈↓ ↓⊗
␈↓ ↓⊗
␈↓ ↓⊗
␈↓ ↓⊗
␈↓ ↓⊗
␈↓ ↓⊗
␈↓ ↓⊗
␈↓ ↓⊗