// $Source$ // $Revision$ // $Date$ $use Access Arithm Box Compare StdIO Table; Abs s.num, { <"<" (s.num) (0)> = <"*" s.num -1>; s.num; }; Max s1 s2, { <">" (s1) (s2)> = s1; s2; }; Put s.box expr = expr>; 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;; }; /* * 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; }; /* * Repeat e.expr s.num times. */ Repeat { 0 e = /*empty*/; s.num expr = expr expr>; };