// $Id$ $use Access Arithm Box Class Compare Convert List StdIO Table; IsRFP_Debug = ; RFP_Double_Copy s.tab = :: s.new_tab, { : e (e.key) e, : s.tab1, )>, $fail; s.new_tab; }; RFP_Double_Unbind s.tab e.keys = { e.keys : e t.key e, , $fail;; }; RFP_Extract_Qualifiers { (e1 s2 s3 e4), = (e1) s2 s3 e4; (e1 s2) = (e1) s2; (e1) = () e1; }; Del_Pragmas { eL t.Item eR, t.Item : \{ (PRAGMA e) = eL ; (expr) = eL () ; }; e1 = e1; }; /* * e.patterns -- set of terms t1 t2 ... tN, * e.replaces -- set of corresponding replacements in the form * (e.repl1) (e.repl2) ... (e.replN). * Function substitutes e.replI for each occurence of tI in expr. * Sets are considered undirected, so function can fall in cycle, given input * such as (A B) ((B) (A)) A, or even (A) ((A)) A. */ Subst (e.patterns) (e.replaces) expr, { expr : e1 t2 e3, \{ e.patterns : $r e4 t2 e5 = e.replaces> : (e6), e1 (e6 e3); t2 : (e7) = : { e7 = e1 t2 (e3); e8 = e1 ((e8) e3); }; } :: e9 (e10) = e9 ; expr; }; /* * Search for e.pattern in expr (in all depths). */ IsIn \{ (e.pattern) e e.pattern e; (e.pattern) e (expr) e, ; }; //Make-Name s.WORD-or-QWORD e.origname, // { // s.WORD-or-QWORD : WORD, = ; // e.origname; // } :: e.origname, // )>>; Make_Name e.origname = )>>; Print_Name e.name = >;