More files.
authorLars Brinkhoff <lars@nocrew.org>
Tue, 30 Apr 2019 06:40:42 +0000 (08:40 +0200)
committerLars Brinkhoff <lars@nocrew.org>
Tue, 30 Apr 2019 06:43:30 +0000 (08:43 +0200)
<clr>/parse-definitions.mud.1 [new file with mode: 0644]
<mdl.comp>/getord.mud.1 [new file with mode: 0644]
<mdl>/m104uni.save.1 [new file with mode: 0644]
<mdllib>/lsrtns.mud.20 [new file with mode: 0644]
<mimc.mim>/em.mud.1 [new file with mode: 0644]

diff --git a/<clr>/parse-definitions.mud.1 b/<clr>/parse-definitions.mud.1
new file mode 100644 (file)
index 0000000..a41af95
--- /dev/null
@@ -0,0 +1,493 @@
+
+<PACKAGE "PARSE-DEFINITIONS">
+
+"Definitions of types and offsets appropriate for trees built by ADAPLEX
+ parser"
+
+<ENTRY PRETTY
+       NOT-PRETTY
+       USETYPE
+       FOR-LOOP
+       ITERATOR
+       FOR-BODY
+       ITERATION
+       LOOP-CONTROL
+       LOOP-IDENTIFIER
+       LOOP-SET-EXPRESSION
+       LOOP-PREDICATE
+       LOOP-ORDER
+       LOOP-ORDER-FUNCTION
+       RETRIEVE
+       RETRIEVE-SET
+       RETRIEVE-WORKSPACE
+       RETRIEVE-TARGET-LIST
+       PRINTYPE
+       IFTYPE
+       CLAUSE
+       CLAUSE-PREDICATE
+       CLAUSE-LIST-OF-COMMANDS
+       SETTYPE
+       FCN
+       FCN-NAME
+       FCN-ARGUMENT
+       RESTRICTION
+       RESTRICT-ID
+       RESTRICT-SET
+       RESTRICT-PRED
+       OPERATOR
+       OP-NAME
+       OP-OP1
+       OP-OP2
+       QUANTIFIER
+       QUANT-TYPE
+       QUANT-NUM
+       QUANT-ID
+       QUANT-SET
+       QUANT-PRED
+       QUANT-TEST
+       EXISTS
+       EXISTS-TYPE
+       EXISTS-SET
+       AGGREGATE
+       AGG-NAME
+       AGG-FCN
+       AGG-SET
+       AGG-OVER
+       IDENTIFIER
+       ID-NAME
+       ID-TYPE
+       ID-OTHER
+       VIRTUAL
+       ENTITY-DEF-EXTENT
+       ENTITY-DEF-VIRTUAL?
+       SUPERTYPE
+       COTYPE
+       FCN-DFN
+       FCN-DFN-NAME
+       FCN-DFN-FORMAT
+       EXTENT
+       EXTENT-NAME
+       EXTENT-EMAP
+       EXTENT-FMAP
+       JOIN
+       PROJECT
+       PROJECT-MAPLIST
+       PROJECT-FCNLIST
+       FCNMAP
+       FCNMAP-NAME
+       FCNMAP-SETEXP
+       ENTITY-DEF
+       ENTITY-DEF-NAME
+       ENTITY-DEF-FCN-LIST
+       ENTITY-DEF-SUPERTYPES
+       ENTITY-DEF-COTYPES>
+
+"\f"
+
+"Define MSETG to SETG an atom and make it manifest as well"
+
+<DEFINE MSETG (ATOM VAL) <SETG .ATOM .VAL> <MANIFEST .ATOM>>
+
+
+"INDENTATION and INDENT-AMT are used in pretty printing of ADAPLEX"
+
+<SET INDENTATION 0>
+
+<MSETG INDENT-AMT 8>
+
+"Define type for USE statement"
+
+<NEWTYPE USETYPE LIST>
+
+<DEFINE P-USETYPE (L) <IPRINC "USE ">
+       <PRINT-LIST .L>
+       <PRINC !\;>>
+
+<NEWTYPE FOR-LOOP VECTOR '<<PRIMTYPE VECTOR> ITERATION LIST>>
+
+"FOR loops have iteration spec and a list of commands"
+
+<MSETG ITERATOR <OFFSET 1 FOR-LOOP>>
+
+<MSETG FOR-BODY <OFFSET 2 FOR-LOOP>>
+
+"Function to print for loops nicely"
+
+<DEFINE PRINT-FOR (FL) 
+       #DECL ((FL) FOR-LOOP)
+       <IPRINT <ITERATOR .FL>>
+       <CRLF>
+       <SET INDENTATION <+ .INDENTATION ,INDENT-AMT>>
+       <PRINT-SEQ <FOR-BODY .FL>>
+       <IPRINC "END;">
+       <SET INDENTATION <- .INDENTATION ,INDENT-AMT>>>
+
+"\f"
+"Type ITERATION specifies the range of a for loop."
+
+<NEWTYPE ITERATION
+        VECTOR
+        '<<PRIMTYPE VECTOR> <OR FALSE FIX>
+                            IDENTIFIER
+                            ANY
+                            ANY
+                            ATOM
+                            <OR IDENTIFIER FALSE>>>
+
+<MSETG LOOP-CONTROL <OFFSET 1 ITERATION>>
+
+<MSETG LOOP-IDENTIFIER <OFFSET 2 ITERATION>>
+
+<MSETG LOOP-SET-EXPRESSION <OFFSET 3 ITERATION>>
+
+<MSETG LOOP-PREDICATE <OFFSET 4 ITERATION>>
+
+<MSETG LOOP-ORDER <OFFSET 5 ITERATION>>
+
+<MSETG LOOP-ORDER-FUNCTION <OFFSET 6 ITERATION>>
+
+
+
+<DEFINE ITERATOR-PRINT (ITER) 
+       #DECL ((ITER) ITERATION)
+       <IPRINC "FOR ">
+       <COND (<LOOP-CONTROL .ITER>
+              <PRINC "UP TO ">
+              <PRIN1 <LOOP-CONTROL .ITER>>)
+             (ELSE <PRINC "EACH">)>
+       <PRINC " ">
+       <PRIN1 <LOOP-IDENTIFIER .ITER>>
+       <PRINC " IN ">
+       <PRIN1 <LOOP-SET-EXPRESSION .ITER>>
+       <COND (<LOOP-PREDICATE .ITER>
+              <PRINC " WHERE ">
+              <PRIN1 <LOOP-PREDICATE .ITER>>)>
+       <COND (<N==? <LOOP-ORDER .ITER> RANDOM>
+              <PRINC " IN ">
+              <PRIN1 <LOOP-ORDER .ITER>>
+              <PRINC " BY ">
+              <PRIN1 <LOOP-ORDER-FUNCTION .ITER>>)>>
+
+"Type RETRIEVE is produced by a Retrieve statement in the language"
+
+<NEWTYPE RETRIEVE VECTOR '<<PRIMTYPE VECTOR> ANY IDENTIFIER LIST>>
+
+<MSETG RETRIEVE-SET <OFFSET 1 RETRIEVE>>
+
+<MSETG RETRIEVE-WORKSPACE <OFFSET 2 RETRIEVE>>
+
+<MSETG RETRIEVE-TARGET-LIST <OFFSET 3 RETRIEVE>>
+
+<DEFINE PRINT-RETRIEVE (RETRV) #DECL ((RETRV) RETRIEVE)
+       <IPRINC "RETRIEVE ">
+       <PRIN1 <RETRIEVE-SET .RETRV>>
+       <PRINC " INTO ">
+       <PRIN1 <RETRIEVE-WORKSPACE .RETRV>>
+       <PRINC " ">
+       <PRINT-LIST <RETRIEVE-TARGET-LIST .RETRV>>
+       <PRINC ";">>
+
+"\f"
+"Type PRINTYPE is produced for a PRINT command"
+
+<NEWTYPE PRINTYPE LIST>
+
+<DEFINE PRINT-PRINT (L)
+       <IPRINC "PRINT ">
+       <PRINT-LIST .L>>
+
+"Various kinds of IFs become IFTYPE.  IFTYPE is a list of CLAUSEs.  Each
+ clause has a predicate and a list of things to do on truth."
+
+<NEWTYPE IFTYPE LIST>
+
+<DEFINE IFTYPE-PRINT (L "AUX" (FIRST T)) 
+       #DECL ((L) IFTYPE)
+       <MAPF <>
+             <FUNCTION (C) 
+                     #DECL ((C) CLAUSE)
+                     <COND (<==? <CLAUSE-PREDICATE .C> ELSE> <IPRINC "ELSE ">)
+                           (ELSE
+                            <COND (.FIRST <IPRINC "IF ">)
+                                  (ELSE <IPRINC "ELSEIF ">)>
+                            <PRIN1 <CLAUSE-PREDICATE .C>>
+                            <PRINC " THEN ">)>
+                     <CRLF>
+                     <SET INDENTATION <+ .INDENTATION ,INDENT-AMT>>
+                     <PRINT-SEQ <CLAUSE-LIST-OF-COMMANDS .C>>
+                     <SET INDENTATION <- .INDENTATION ,INDENT-AMT>>
+                     <SET FIRST <>>>
+             .L>
+       <IPRINC "END IF">>
+
+<NEWTYPE CLAUSE VECTOR '<<PRIMTYPE VECTOR> ANY LIST>>
+
+<MSETG CLAUSE-PREDICATE <OFFSET 1 CLAUSE>>
+
+<MSETG CLAUSE-LIST-OF-COMMANDS <OFFSET 2 CLAUSE>>
+
+"\f"
+
+"Explicit sets become lists of the explicit objects in the set"
+
+<NEWTYPE SETTYPE LIST>
+
+<DEFINE SET-PRINT (L) <PRINT-LIST .L>>
+
+"Type FCN is for entity function calls"
+
+<NEWTYPE FCN VECTOR '<<PRIMTYPE VECTOR> IDENTIFIER ANY>>
+
+<MSETG FCN-NAME <OFFSET 1 FCN>>
+
+<MSETG FCN-ARGUMENT <OFFSET 2 FCN>>
+
+<DEFINE FCN-PRINT (FC) #DECL ((FC) FCN)
+       <PRIN1 <FCN-NAME .FC>>
+       <PRINC " (">
+       <PRIN1 <FCN-ARGUMENT .FC>>
+       <PRINC ")">>
+
+"Type RESTRICTION is for restricted sets.  It has a variable, an input set and
+ a predicate"
+
+<NEWTYPE RESTRICTION VECTOR '<<PRIMTYPE VECTOR> IDENTIFIER ANY ANY>>
+
+<MSETG RESTRICT-ID <OFFSET 1 RESTRICTION>>
+
+<MSETG RESTRICT-SET <OFFSET 2 RESTRICTION>>
+
+<MSETG RESTRICT-PRED <OFFSET 3 RESTRICTION>>
+
+<DEFINE RESTRICT-PRINT (RES) #DECL ((RES) RESTRICTION)
+       <PRINC "(">
+       <PRIN1 <RESTRICT-ID .RES>>
+       <PRINC " IN ">
+       <PRIN1 <RESTRICT-SET .RES>>
+       <PRINC " WHERE ">
+       <PRIN1 <RESTRICT-PRED .RES>>
+       <PRINC ")">>
+"\f"
+"Type OPERATOR is for +,- etc."
+
+<NEWTYPE OPERATOR VECTOR '<<PRIMTYPE VECTOR> ATOM ANY ANY>>
+
+<MSETG OP-NAME <OFFSET 1 OPERATOR>>
+
+<MSETG OP-OP1 <OFFSET 2 OPERATOR>>
+
+<MSETG OP-OP2 <OFFSET 3 OPERATOR>>
+
+<DEFINE OP-PRINT (OP) #DECL ((OP) OPERATOR)
+       <COND (<OP-OP2 .OP>     ;"Binary operator"
+              <COND (<TYPE? <OP-OP1 .OP> OPERATOR>
+                     <PRINC "(">)>
+              <PRIN1 <OP-OP1 .OP>>
+              <COND (<TYPE? <OP-OP1 .OP> OPERATOR>
+                     <PRINC ")">)>
+              <COND (<L=? <LENGTH <SPNAME <OP-NAME .OP>>> 2>
+                     <PRINC <OP-NAME .OP>>)
+                    (ELSE
+                     <PRINC " ">
+                     <PRINC <OP-NAME .OP>>
+                     <PRINC " ">)>
+              <COND (<TYPE? <OP-OP2 .OP> OPERATOR>
+                     <PRINC "(">)>
+              <PRIN1 <OP-OP2 .OP>>     
+              <COND (<TYPE? <OP-OP2 .OP> OPERATOR>
+                     <PRINC ")">)>)
+             (ELSE
+              <COND (<L=? <LENGTH <SPNAME <OP-NAME .OP>>> 2>
+                     <PRINC <OP-NAME .OP>>)
+                    (ELSE
+                     <PRINC <OP-NAME .OP>>
+                     <PRINC " ">)>
+              <PRIN1 <OP-OP1 .OP>>)>>
+
+"\f"
+"Type QUANTIFIER is for DAPLEX quantifiers FOR SOME etc."
+
+<NEWTYPE QUANTIFIER
+        VECTOR
+        '<<PRIMTYPE VECTOR> ATOM FIX IDENTIFIER ANY ANY ANY>>
+
+<MSETG QUANT-TYPE <OFFSET 1 QUANTIFIER>>
+
+<MSETG QUANT-NUM <OFFSET 2 QUANTIFIER>>
+
+<MSETG QUANT-ID <OFFSET 3 QUANTIFIER>>
+
+<MSETG QUANT-SET <OFFSET 4 QUANTIFIER>>
+
+<MSETG QUANT-PRED <OFFSET 5 QUANTIFIER>>
+
+<MSETG QUANT-TEST <OFFSET 6 QUANTIFIER>>
+
+<DEFINE QUANT-PRINT (Q) 
+       #DECL ((Q) QUANTIFIER)
+       <PRINC "FOR ">
+       <COND (<0? <QUANT-NUM .Q>> <PRIN1 <QUANT-TYPE .Q>>)
+             (ELSE
+              <PRINC <COND (<==? <QUANT-TYPE .Q> AT-LEAST> "AT LEAST ")
+                           (ELSE "AT MOST ")>>
+              <PRIN1 <QUANT-NUM .Q>>)>
+       <PRINC " ">
+       <PRIN1 <QUANT-ID .Q>>
+       <PRINC " IN ">
+       <PRIN1 <QUANT-SET .Q>>
+       <COND (<QUANT-PRED .Q> <PRINC " WHERE "> <PRIN1 <QUANT-PRED .Q>>)>
+       <PRINC " TEST ">
+       <PRIN1 <QUANT-TEST .Q>>>
+
+<NEWTYPE EXISTS VECTOR '<<PRIMTYPE VECTOR> ATOM FIX ANY>>
+
+<MSETG EXISTS-TYPE <OFFSET 1 EXISTS>>
+
+<MSETG EXISTS-NUM <OFFSET 2 EXISTS>>
+
+<MSETG EXISTS-SET <OFFSET 3 EXISTS>>
+
+<NEWTYPE AGGREGATE
+        VECTOR
+        '<<PRIMTYPE VECTOR> ATOM <OR IDENTIFIER FALSE> ANY <OR FALSE ATOM>>>
+
+<MSETG AGG-NAME <OFFSET 1 AGGREGATE>>
+
+<MSETG AGG-FCN <OFFSET 2 AGGREGATE>>
+
+<MSETG AGG-SET <OFFSET 3 AGGREGATE>>
+
+<MSETG AGG-OVER <OFFSET 4 AGGREGATE>>
+
+<NEWTYPE IDENTIFIER VECTOR '<<PRIMTYPE VECTOR> ATOM ANY ANY>>
+
+<MSETG ID-NAME <OFFSET 1 IDENTIFIER>>
+
+<MSETG ID-TYPE <OFFSET 1 IDENTIFIER>>
+
+<MSETG ID-OTHER <OFFSET 1 IDENTIFIER>>
+
+<DEFINE PRINT-ID (ID) #DECL ((ID) IDENTIFIER) <PRIN1 <ID-NAME .ID>>>
+
+<NEWTYPE SUPERTYPE LIST>
+
+<NEWTYPE COTYPE LIST>
+
+<NEWTYPE FCN-DFN VECTOR '<<PRIMTYPE VECTOR> IDENTIFIER ANY>>
+
+<MSETG FCN-DFN-NAME <OFFSET 1 FCN-DFN>>
+
+<MSETG FCN-DFN-FORMAT <OFFSET 2 FCN-DFN>>
+
+<NEWTYPE EXTENT
+        VECTOR
+        '<<PRIMTYPE VECTOR> IDENTIFIER
+                            <OR JOIN RESTRICTION PROJECT>
+                            <LIST [REST FCNMAP]>>>
+
+<MSETG EXTENT-NAME <OFFSET 1 EXTENT>>
+
+<MSETG EXTENT-EMAP <OFFSET 2 EXTENT>>
+
+<MSETG EXTENT-FMAP <OFFSET 3 EXTENT>>
+
+<NEWTYPE JOIN LIST>
+
+<NEWTYPE PROJECT VECTOR '<<PRIMTYPE VECTOR> LIST LIST>>
+
+<MSETG PROJECT-MAPLIST <OFFSET 1 PROJECT>>
+
+<MSETG PROJECT-FCNLIST <OFFSET 2 PROJECT>>
+
+<NEWTYPE FCNMAP VECTOR '<<PRIMTYPE VECTOR> IDENTIFIER ANY>>
+
+<MSETG FCNMAP-NAME <OFFSET 1 FCNMAP>>
+
+<MSETG FCNMAP-SETEXP <OFFSET 2 FCNMAP>>
+
+<NEWTYPE ENTITY-DEF
+        VECTOR
+        '<<PRIMTYPE VECTOR> IDENTIFIER
+                            LIST
+                            <OR FALSE <LIST ANY>>
+                            <OR FALSE <LIST ANY>>
+                            <OR FALSE ATOM>
+                            <OR EXTENT FALSE>>>
+
+<MSETG ENTITY-DEF-NAME <OFFSET 1 ENTITY-DEF>>
+
+<MSETG ENTITY-DEF-FCN-LIST <OFFSET 2 ENTITY-DEF>> 
+
+<MSETG ENTITY-DEF-SUPERTYPES <OFFSET 3 ENTITY-DEF>>
+
+<MSETG ENTITY-DEF-COTYPES <OFFSET 4 ENTITY-DEF>>
+
+<MSETG ENTITY-DEF-VIRTUAL? <OFFSET 5 ENTITY-DEF>>
+
+<MSETG ENTITY-DEF-EXTENT <OFFSET 6 ENTITY-DEF>>
+
+
+"Utility print stuff"
+
+<DEFINE PRINT-LIST (L) #DECL ((L) <PRIMTYPE LIST>)
+       <PRINC "(">
+       <MAPR <>
+             <FUNCTION (LL "AUX" (X <1 .LL>))
+               <PRIN1 .X>
+               <COND (<EMPTY? <REST .LL>> <PRINC ")">)
+                     (ELSE <PRINC ", ">)>>
+             .L>>
+
+<DEFINE PRINT-SEQ (L) #DECL ((L) <PRIMTYPE LIST>)
+       <MAPF <>
+             <FUNCTION (X)
+               <IPRINT .X>
+               <PRINC ";">
+               <CRLF>> .L>>
+
+<DEFINE IPRINT (OBJ)
+       <INDENT-TO .INDENTATION>
+       <PRIN1 .OBJ>>
+
+<DEFINE IPRINC (OBJ)
+       <INDENT-TO .INDENTATION>
+       <PRINC .OBJ>>
+
+
+<DEFINE PRETTY () 
+       <MAPF <> <FUNCTION (TYPE FCN) <PRINTTYPE .TYPE .FCN>> ,TYPES ,PSUBRS>>
+
+<DEFINE NOT-PRETTY ()
+       <MAPF <> <FUNCTION (TYPE) <PRINTTYPE .TYPE ,PRINT>> ,TYPES>>
+
+<SETG TYPES
+      '![USETYPE
+        FOR-LOOP
+        ITERATION
+        RETRIEVE
+        PRINTYPE
+        IFTYPE
+        SETTYPE
+        FCN
+        RESTRICTION
+        OPERATOR
+        QUANTIFIER
+        IDENTIFIER!]>
+
+<SETG PSUBRS
+      [,P-USETYPE
+       ,PRINT-FOR
+       ,ITERATOR-PRINT
+       ,PRINT-RETRIEVE
+       ,PRINT-PRINT
+       ,IFTYPE-PRINT
+       ,SET-PRINT
+       ,FCN-PRINT
+       ,RESTRICT-PRINT
+       ,OP-PRINT
+       ,QUANT-PRINT
+       ,PRINT-ID]>
+
+<ENDPACKAGE>
+\0
\ No newline at end of file
diff --git a/<mdl.comp>/getord.mud.1 b/<mdl.comp>/getord.mud.1
new file mode 100644 (file)
index 0000000..2d8431f
--- /dev/null
@@ -0,0 +1,244 @@
+
+"GETORDER FUNCTIONS"
+
+<DEFINE CHECK (ATM)
+       #DECL ((ATM) <UNSPECIAL ATOM>)
+       <AND <TYPE? .ATM ATOM>
+            <GASSIGNED? .ATM>
+            <OR <TYPE? ,.ATM FUNCTION>
+                <TYPE? ,.ATM MACRO>>>>
+
+<DEFINE PREV (LS SUBLS)
+       #DECL ((LS SUBLS) <UNSPECIAL LIST> (VALUE) LIST)
+       <REST .LS <- <LENGTH .LS> <LENGTH .SUBLS> 1>>>
+
+<DEFINE SPLOUTEM (FL OU)
+       #DECL ((FL) <UNSPECIAL LIST> (OU) <UNSPECIAL ATOM>)
+       <REPEAT (TEM)
+               #DECL ((TEM) <UNSPECIAL <PRIMTYPE LIST>>)
+               <COND (<EMPTY? .FL> <RETURN T>)
+                     (<SET TEM <MEMQ .OU <1 .FL>>>
+                      <COND (<==? <1 .FL> .TEM> <PUT .FL 1 <REST .TEM>>)
+                            (ELSE <PUTREST <PREV <1 .FL> .TEM> <REST .TEM>>)>)>
+               <SET FL <REST .FL 2>>>>
+
+<DEFINE REVERSE (LS)
+       #DECL ((LS) <UNSPECIAL LIST>)
+       <REPEAT ((RES ()) (TEM ()))
+               #DECL ((RES TEM) LIST)
+               <COND (<EMPTY? .LS> <RETURN .RES>)>
+               <SET TEM <REST .LS>>
+               <SET RES <PUTREST .LS .RES>>
+               <SET LS .TEM>>>
+
+<DEFINE ORDEREM (FLIST)
+   #DECL ((FLIST) <UNSPECIAL LIST>)
+   <REPEAT (TEM (RES ()))
+     #DECL ((RES) <UNSPECIAL <LIST [REST <OR ATOM LIST>]>>
+           (VALUE) <LIST [REST <OR ATOM LIST>]>
+           (TEM) <UNSPECIAL <PRIMTYPE LIST>>)
+     <COND
+      (<EMPTY? .FLIST> <RETURN <REVERSE .RES>>)
+      (<SET TEM <MEMQ () .FLIST>>
+       <SET RES (<2 .TEM> !.RES)>
+       <COND (<==? .TEM .FLIST> <SET FLIST <REST .FLIST 2>>)
+            (ELSE <PUTREST <PREV .FLIST .TEM> <REST .TEM 2>>)>
+       <SPLOUTEM .FLIST <1 .RES>>)
+      (ELSE
+       <PROG ((RES2 ()) GOTONE)
+            #DECL ((RES2) LIST)
+            <SET GOTONE <>>
+            <REPEAT ((RES1 .FLIST))
+                    #DECL ((RES1) LIST)
+                    <COND (<NOT <CALLME <2 .RES1> .FLIST>>
+                           <SET GOTONE T>
+                           <SET RES2 (<2 .RES1> !.RES2)>
+                           <COND (<==? .FLIST .RES1>
+                                  <SET FLIST <REST .FLIST 2>>)
+                                 (ELSE
+                                  <PUTREST <PREV .FLIST .RES1>
+                                           <REST .RES1 2>>)>)>
+                    <AND <EMPTY? <SET RES1 <REST .RES1 2>>> <RETURN>>>
+            <COND (.GOTONE <AGAIN>)
+                  (<NOT <EMPTY? .FLIST>> <SET FLIST <CORDER .FLIST>>)>
+            <SET TEM <REVERSE .RES>>
+            <COND (<NOT <EMPTY? .FLIST>>
+                   <COND (<EMPTY? .RES>
+                          <SET TEM .FLIST>
+                          <SET RES <REST .FLIST <- <LENGTH .FLIST> 1>>>)
+                         (ELSE
+                          <SET RES
+                               <REST <PUTREST .RES .FLIST>
+                                     <LENGTH .FLIST>>>)>)>
+            <COND (<EMPTY? .RES> <SET RES .RES2>)
+                  (ELSE <PUTREST .RES .RES2> <SET RES .TEM>)>>
+       <RETURN .RES>)>>>
+
+<DEFINE CALLME (ATM LST)
+       #DECL ((ATM) ATOM (LST) <LIST [REST <LIST [REST ATOM]> ATOM]>)
+       <REPEAT ()
+               <AND <EMPTY? .LST> <RETURN <>>>
+               <AND <MEMQ .ATM <1 .LST>> <RETURN>>
+               <SET LST <REST .LST 2>>>>
+
+<DEFINE CORDER (LST "AUX" (RES ()))
+       #DECL ((LST) <LIST [REST <LIST [REST ATOM]> ATOM]> (RES) LIST)
+       <REPEAT ((LS .LST))
+               #DECL ((LS) <LIST [REST LIST ATOM]>)
+               <AND <EMPTY? .LS> <RETURN>>
+               <PUT .LS 1 <ALLREACH (<2 .LS>) <1 .LS> .LST>>
+               <SET LS <REST .LS 2>>>
+       <REPEAT ((PNT ()))
+               #DECL ((PNT) <LIST [REST LIST ATOM]>)
+               <REPEAT ((SHORT <CHTYPE <MIN> FIX>) (TL 0) (LST .LST))
+                       #DECL ((SHORT TL) FIX (LST) <LIST [REST LIST ATOM]>)
+                       <AND <EMPTY? .LST> <RETURN>>
+                       <COND (<L? <SET TL <LENGTH <1 .LST>>> .SHORT>
+                              <SET SHORT .TL>
+                              <SET PNT .LST>)>
+                       <SET LST <REST .LST 2>>>
+               <SET RES
+                    (<COND (<1? <LENGTH <1 .PNT>>> <1 <1 .PNT>>)
+                           (ELSE <1 .PNT>)>
+                     !.RES)>
+               <MAPF <> <FUNCTION (ATM) <SPLOUTEM .LST .ATM>> <1 .PNT>>
+               <REPEAT (TEM)
+                       <COND (<SET TEM <MEMQ () .LST>>
+                              <COND (<==? .TEM .LST> <SET LST <REST .TEM 2>>)
+                                    (ELSE
+                                     <PUTREST <PREV .LST .TEM>
+                                              <REST .TEM 2>>)>)
+                             (ELSE <RETURN>)>>
+               <AND <EMPTY? .LST> <RETURN>>>
+       <REVERSE .RES>>
+
+<DEFINE ALLREACH (LATM LST MLST)
+   #DECL ((LATM LST) <LIST [REST ATOM]>
+         (MLST) <LIST [REST <LIST [REST ATOM]> ATOM]>)
+   <MAPF <>
+    <FUNCTION (ATM)
+           #DECL ((ATM) ATOM)
+           <COND (<MEMQ .ATM .LATM>)
+                 (ELSE
+                  <SET LATM
+                       <ALLREACH (.ATM !.LATM)
+                                 <REPEAT ((L .MLST))
+                                         #DECL ((L) <LIST [REST LIST ATOM]>)
+                                         <AND <==? <2 .L> .ATM>
+                                              <RETURN <1 .L>>>
+                                         <SET L <REST .L 2>>>
+                                 .MLST>>)>>
+    .LST>
+   .LATM>
+
+<DEFINE REMEMIT (ATM)
+       #DECL ((ATM) ATOM (FUNC) <SPECIAL ATOM>
+              (FUNCL) <SPECIAL <LIST [REST ATOM]>>)
+       <OR <==? .ATM .FUNC>
+           <MEMQ .ATM .FUNCL>
+           <SET FUNCL (.ATM !.FUNCL)>>>
+
+<DEFINE FINDREC (OBJ "AUX" (FM '<>))
+       #DECL ((FM) FORM)
+       <COND (<MONAD? .OBJ>)
+             (<AND <TYPE? .OBJ FORM SEGMENT>
+                   <NOT <EMPTY? <SET FM <CHTYPE .OBJ FORM>>>>>
+              <COND (<AND <TYPE? <1 .FM> ATOM> <GASSIGNED? <1 .FM>>>
+                     <AND <TYPE? ,<1 .FM> FUNCTION> <REMEMIT <1 .FM>>>
+                     <AND <TYPE? ,<1 .FM> MACRO>
+                       <NOT <EMPTY? ,<1 .FM>>>
+                               <FINDREC <EMACRO .FM>>>
+                               ;"Analyze expansion of MACRO call"
+                     <AND <OR <==? ,<1 .FM> ,MAPF> <==? ,<1 .FM> ,MAPR>>
+                          <NOT <LENGTH? .FM 3>>
+                          <PROG ()
+                                <AND <TYPE? <2 .FM> FORM> <CHK-GVAL <2 .FM>>>
+                                T>
+                          <PROG ()
+                                <AND <TYPE? <3 .FM> FORM>
+                                     <CHK-GVAL <3 .FM>>>>>)
+                    (<STRUCTURED? <1 .OBJ>> <MAPF <> ,FINDREC <1 .OBJ>>)>
+              <COND (<EMPTY? <REST .OBJ>>)
+                    (ELSE <MAPF <> ,FINDREC <REST .OBJ>>)>)
+             (ELSE <MAPF <> ,FINDREC .OBJ>)>>
+
+<DEFINE EMACRO (OBJ "AUX" (ERR <GET ERROR!-INTERRUPTS INTERRUPT>) TEM) 
+       <COND (.ERR <OFF .ERR>)>
+       <ON "ERROR"
+           <FUNCTION (FR "TUPLE" T) 
+                   <COND (<AND <GASSIGNED? MACACT> <LEGAL? ,MACACT>>
+                          <DISMISS [!.T] ,MACACT>)
+                         (ELSE <APPLY ,<PARSE "OVALRET!-COMBAT!-"> " ">)>>
+           100>
+       <COND (<TYPE? <SET TEM
+                          <PROG MACACT () #DECL ((MACACT) <SPECIAL ACTIVATION>)
+                                <SETG MACACT .MACACT>
+                                (<EXPAND .OBJ>)>>
+                     VECTOR>
+              <OFF "ERROR">
+              <COND (.ERR <EVENT .ERR>)>
+              <ERROR " MACRO EXPANSION LOSSAGE " !.TEM>)
+             (ELSE <OFF "ERROR"> <AND .ERR <EVENT .ERR>> <1 .TEM>)>>
+
+<DEFINE CHK-GVAL (FM) #DECL ((FM) FORM)
+       <AND    <==? <LENGTH .FM> 2>
+               <TYPE? <1 .FM> ATOM>
+               <==? ,<1 .FM> ,GVAL>
+               <TYPE? <2 .FM> ATOM>
+               <GASSIGNED? <2 .FM>>
+               <OR <TYPE? ,<2 .FM> FUNCTION>
+                       <AND <TYPE? ,<2 .FM> MACRO>
+                               <NOT <EMPTY? ,<2 .FM>>>
+                               <TYPE? <1 ,<2 .FM>> FUNCTION>>>
+               <REMEMIT <2 .FM>>>>
+
+<DEFINE FINDEM (FUNC "AUX" (FUNCL ()))
+       #DECL ((FUNC) <SPECIAL ATOM> (FUNCL) <SPECIAL <LIST [REST ATOM]>>
+              (VALUE) <LIST [REST ATOM]>)
+       <FINDREC ,.FUNC>
+       .FUNCL>
+
+<DEFINE FINDEMALL (ATM
+                  "AUX" (TOPDO
+                         <REPEAT ((TD ()))
+                                 #DECL ((TD) LIST
+                                        (VALUE)
+                                        <LIST <LIST [REST ATOM]> ATOM>)
+                                 <AND <EMPTY? .ATM> <RETURN .TD>>
+                                 <SET TD (<FINDEM <1 .ATM>> <1 .ATM> !.TD)>
+                                 <SET ATM <REST .ATM>>>))
+       #DECL ((ATM) <UNSPECIAL <TUPLE [REST ATOM]>>
+              (TOPDO) <UNSPECIAL <LIST <LIST [REST ATOM]> ATOM>>)
+       <REPEAT ((TODO .TOPDO) (CURDO <1 .TOPDO>))
+               #DECL ((TODO) <UNSPECIAL LIST>
+                      (CURDO) <UNSPECIAL <LIST [REST ATOM]>>)
+               <COND (<EMPTY? .CURDO>
+                      <COND (<EMPTY? <SET TODO <REST .TODO 2>>>
+                             <RETURN .TOPDO>)
+                            (ELSE <SET CURDO <1 .TODO>> <AGAIN>)>)
+                     (<MEMQ <1 .CURDO> .TOPDO>)
+                     (ELSE
+                      <PUTREST <REST .TODO <- <LENGTH .TODO> 1>>
+                               (<FINDEM <1 .CURDO>> <1 .CURDO>)>)>
+               <SET CURDO <REST .CURDO>>>>
+
+<DEFINE GETORDER ("TUPLE" ATMS)
+       #DECL ((ATMS) <UNSPECIAL <TUPLE [REST ATOM]>>)
+       <COND (<NOT <MEMQ #FALSE () <MAPF ,LIST ,CHECK .ATMS>>>
+              <ORDEREM <FINDEMALL .ATMS>>)
+             (ELSE <ERROR BAD-ARG GETORDER>)>>
+
+
+
+<SET LIST_OF_FUNCTIONS
+     '(CHECK
+       PREV
+       SPLOUTEM
+       REVERSE
+       ORDEREM
+       REMEMIT
+       FINDREC
+       FINDEM
+       FINDEMALL
+       GETORDER)>
+\f\ 3\ 3\ 3
\ No newline at end of file
diff --git a/<mdl>/m104uni.save.1 b/<mdl>/m104uni.save.1
new file mode 100644 (file)
index 0000000..19caeda
Binary files /dev/null and b//m104uni.save.1 differ
diff --git a/<mdllib>/lsrtns.mud.20 b/<mdllib>/lsrtns.mud.20
new file mode 100644 (file)
index 0000000..68ec45f
Binary files /dev/null and b//lsrtns.mud.20 differ
diff --git a/<mimc.mim>/em.mud.1 b/<mimc.mim>/em.mud.1
new file mode 100644 (file)
index 0000000..2594073
--- /dev/null
@@ -0,0 +1,17 @@
+<DEFINE EMACRO (OBJ "AUX" (ERR <GET ERROR!-INTERRUPTS INTERRUPT>) TEM) 
+       <COND (.ERR <OFF .ERR>)>
+       <ON "ERROR"
+           <FUNCTION (FR "TUPLE" T) 
+                   <COND (<AND <GASSIGNED? MACACT> <LEGAL? ,MACACT>>
+                          <DISMISS [!.T] ,MACACT>)
+                         (ELSE <APPLY ,<PARSE "OVALRET!-COMBAT!-"> " ">)>>
+           100>
+       <COND (<TYPE? <SET TEM
+                          <PROG MACACT () #DECL ((MACACT) <SPECIAL ANY>)
+                                <SETG MACACT .MACACT>
+                                (<EXPAND .OBJ>)>>
+                     VECTOR>
+              <OFF "ERROR">
+              <COND (.ERR <EVENT .ERR>)>
+              <ERROR " MACRO EXPANSION LOSSAGE " !.TEM>)
+             (ELSE <OFF "ERROR"> <AND .ERR <EVENT .ERR>> <1 .TEM>)>>
\ No newline at end of file