// $Source$ // $Revision$ // $Date$ $use Apply Access Arithm; //$func Deparen-Term (expr) = expr; $func Deparen-Term e = e; //$func Paren-Term term = (term); $func Paren-Term e = e; Zip (e.list1) (e.list2) = (e.list1) (e.list2) /*empty*/ $iter { e.list1 : t.first1 e.rest1, e.list2 : t.first2 e.rest2 = (e.rest1) (e.rest2) e.new-list (t.first1 t.first2); } :: (e.list1) (e.list2) e.new-list, e.list1 : /*empty*/ = e.new-list; Map s.Fname e.Fargs (e.list) = () e.list $iter { e.list : t.item e.rest = (e.new-list ) e.rest; } :: (e.new-list) e.list, e.list : /*empty*/ = e.new-list; Filter s.Fname e.Fargs (e.list) = () e.list $iter { e.list : t.item e.rest, { : e = (e.new-list t.item) e.rest; (e.new-list) e.rest; }; } :: (e.new-list) e.list, e.list : /*empty*/ = e.new-list; Split s.Fname e.Fargs (e.list) = () () e.list $iter { e.list : t.item e.rest, { : e = (e.true-list t.item) (e.false-list) e.rest; (e.true-list) (e.false-list t.item) e.rest; }; } :: (e.true-list) (e.false-list) e.list, e.list : /*empty*/ = (e.true-list) (e.false-list); Elem? e.list t.item = e.list : e t.item e; Get-Elem s.num (e.list) = ; Foldr s.Fname e.Fargs (e.value) (e.list) = (e.value) e.list $iter { e.list : e.something t.last = () e.something; } :: (e.value) e.list, e.list : /*empty*/ = e.value; Foldr1 s.Fname e.Fargs (e.list), { e.list : e.something t.last = ; /*empty*/; }; Concat e.lists = ; Deparen-Term (expr) = expr; Paren expr = ; Paren-Term term = (term); Reverse { term e.list = term; /*empty*/ = /*empty*/; }; Nub e.expr = e.expr () $iter { e.expr : term e.rest, { e.selected : e term e = e.rest (e.selected); e.rest (e.selected term); }; } :: e.expr (e.selected), e.expr : /*empty*/ = e.selected; /* * Returns number of e.expr entries in e.source and e.source without all e.expr's. */ Entries e.expr (e.source) = 0 e.source () $iter { e.source : e1 e.expr e2 = <"+" s.num 1> e2 (e.res e1); s.num (e.res e.source); } :: s.num e.source (e.res), e.source : /*empty*/ = s.num e.res; /* * Add to the first list all new elements from the second one. */ Or (e.list1) e.list2 = (e.list1) e.list2 $iter { e.list2 : term e.rest, { e.list1 : e term e = (e.list1) e.rest; (e.list1 term) e.rest; }; } :: (e.list1) e.list2, e.list2 : /*empty*/ = e.list1; /* * Choose from the first list all elements present in the second one. */ And (e.list1) e.list2 = (e.list1) /*empty*/ $iter { e.list1 : term e.rest, { e.list2 : e term e = (e.rest) e.and term; (e.rest) e.and; }; } :: (e.list1) e.and, e.list1 : /*empty*/ = e.and; /* * Choose from the first list all elements not present in the second one. */ Sub (e.list1) e.list2 = (e.list1) /*empty*/ $iter { e.list1 : term e.rest, { e.list2 : e term e = (e.rest) e.not; (e.rest) e.not term; }; } :: (e.list1) e.not, e.list1 : /*empty*/ = e.not;