<> <> <> DIRECTORY Atom USING [PropList, DottedPair, DottedPairNode], Basics USING [Comparison] ; List: CEDAR DEFINITIONS = BEGIN <> AList: TYPE = Atom.PropList; DottedPair: TYPE = Atom.DottedPair; DottedPairNode: TYPE = Atom.DottedPairNode; CompareProc: TYPE = PROC[ref1: REF ANY, ref2: REF ANY] RETURNS [Comparison]; Comparison: TYPE = Basics.Comparison; <> EqLists: PUBLIC PROC [l1, l2: LIST OF REF ANY] RETURNS [BOOLEAN] ; <> Memb: PROC [ref: REF ANY, list: LIST OF REF ANY] RETURNS[BOOLEAN] = INLINE {UNTIL list = NIL DO IF list.first = ref THEN RETURN[TRUE]; list _ list.rest; ENDLOOP; RETURN[FALSE]}; <> Cons: PROC [ref: REF ANY, list: LIST OF REF ANY] RETURNS [LIST OF REF ANY] = INLINE {RETURN[CONS[ref, list]]}; Append: PROC[l1: LIST OF REF ANY, l2: LIST OF REF ANY _ NIL] RETURNS [LIST OF REF ANY]; -- if l2 is NIL, copies top level of l1. CopyTopList: PROC[list: LIST OF REF ANY] RETURNS [LIST OF REF ANY] = INLINE {RETURN[Append[list]]}; Remove: PROC[ref: REF ANY, list: LIST OF REF ANY] RETURNS[LIST OF REF ANY]; Reverse: PROC [list: LIST OF REF ANY] RETURNS[LIST OF REF ANY]; Union: PROC [l1, l2: LIST OF REF ANY] RETURNS[LIST OF REF ANY]; Intersection: PROC [l1, l2: LIST OF REF ANY] RETURNS[LIST OF REF ANY]; ListDifference: PROC [l1, l2: LIST OF REF ANY] RETURNS[LIST OF REF ANY]; -- all elements in l1 not in l2 LDiff: PROC [list, tailOfList: LIST OF REF ANY] RETURNS[LIST OF REF ANY]; <> Nconc: PROC [l1, l2: LIST OF REF ANY] RETURNS[LIST OF REF ANY]; -- like Append Nconc1: PROC [list: LIST OF REF ANY, ref: REF ANY] RETURNS[LIST OF REF ANY] <> = INLINE { z: LIST OF REF ANY _ list; IF z = NIL THEN RETURN[Cons[ref, NIL]]; UNTIL z.rest = NIL DO z _ z.rest; ENDLOOP; z.rest _ Cons[ref, NIL]; RETURN[list]; }; DRemove: PROC [ref: REF ANY, list: LIST OF REF ANY] RETURNS[LIST OF REF ANY]; -- like Remove DReverse: PROC [list: LIST OF REF ANY] RETURNS[LIST OF REF ANY]; -- like Reverse DSubst: PROC [new, old: REF ANY, expr: LIST OF REF ANY] RETURNS[LIST OF REF ANY] ; -- like Subst. <> NthTail: PROC[list: LIST OF REF ANY, n: INT] RETURNS[LIST OF REF ANY]; <> < Length[list].>> NthElement: PROC[list: LIST OF REF ANY, n: INT] RETURNS[REF ANY]; <> <> Cdr: PROC[list: LIST OF REF ANY] RETURNS[LIST OF REF ANY] = INLINE {RETURN[IF list = NIL THEN NIL ELSE list.rest]}; Cddr: PROC[list: LIST OF REF ANY] RETURNS[LIST OF REF ANY] = INLINE {RETURN[IF list = NIL OR list.rest = NIL THEN NIL ELSE list.rest.rest]}; Car: PROC[list: LIST OF REF ANY] RETURNS[REF ANY] = INLINE {RETURN[IF list = NIL THEN NIL ELSE list.first]}; Cadr: PROC[list: LIST OF REF ANY] RETURNS[REF ANY] = INLINE {RETURN[IF list = NIL OR list.rest = NIL THEN NIL ELSE list.rest.first]}; <> Assoc: PROC [key: REF ANY, aList: AList] RETURNS[REF ANY]; DotCons: PROC [key, val: REF ANY] RETURNS [DottedPair]; PutAssoc: PROC [key: REF ANY, val: REF ANY, aList: AList] RETURNS[AList]; <> Length: PROC [list: LIST OF REF ANY] RETURNS[INT]; Map: PROC [list: LIST OF REF ANY, proc: PROCEDURE[REF ANY, LIST OF REF ANY]] ; Subst: PROC [new, old: REF ANY, expr: LIST OF REF ANY] RETURNS [LIST OF REF ANY]; <> Sort: PROC [list: LIST OF REF ANY, compareProc: CompareProc _ Compare] RETURNS[LIST OF REF ANY]; UniqueSort: PROC [list: LIST OF REF ANY, compareProc: CompareProc _ Compare] RETURNS[LIST OF REF ANY]; Compare: CompareProc; <> NotATail: SIGNAL [list, tailOfList: LIST OF REF ANY] RETURNS[LIST OF REF ANY]; -- raised by LDiff END.