DIRECTORY Atom USING [PropList], AtomsPrivate USING [GetAtom, AtomRec, EnumerateAtoms], List USING [DottedPairNode], Rope USING [ROPE, Text, FromChar], SafeStorage USING [NewZone] ; BasicAtomImpl: CEDAR MONITOR IMPORTS AtomsPrivate, Rope, SafeStorage EXPORTS Atom SHARES AtomsPrivate = BEGIN OPEN Atom; PropZone: ZONE _ SafeStorage.NewZone[]; NILNotAnAtom: PUBLIC ERROR = CODE; emptyAtom: PUBLIC ATOM _ MakeAtom[""]; Atom: TYPE = REF AtomsPrivate.AtomRec; ATOMToAtom: PROC [atom: ATOM] RETURNS [Atom] = TRUSTED INLINE { RETURN[LOOPHOLE[atom, Atom]]; }; ATOMToPropList: PROC [atom: ATOM] RETURNS [PropList] = INLINE { RETURN[NARROW[ATOMToAtom[atom].propList, PropList]]; }; MakeAtom: PUBLIC PROCEDURE [pName: Rope.ROPE] RETURNS[ATOM] = TRUSTED { IF pName = NIL THEN RETURN[emptyAtom] ELSE RETURN[AtomsPrivate.GetAtom[pName]]; }; -- of MakeAtom MakeAtomFromChar: PUBLIC PROCEDURE [char: CHARACTER] RETURNS[ATOM] = TRUSTED { RETURN[AtomsPrivate.GetAtom[Rope.FromChar[char]]]; }; -- of MakeAtomFromChar GetPropertyList: PUBLIC PROCEDURE [atom: ATOM] RETURNS[PropList] = { RETURN[IF atom = NIL THEN NIL ELSE ATOMToPropList[atom]]; -- treat NIL as an atom for purposes of GetProp }; -- of GetPropertyList PutProp: PUBLIC PROCEDURE [atom: ATOM, prop: REF ANY, val: REF ANY] = { IF atom = NIL THEN ERROR NILNotAnAtom; ATOMToAtom[atom].propList _ PutPropOnList[propList: ATOMToPropList[atom], prop: prop, val: val]; }; -- of PutProp PutPropOnList: PUBLIC ENTRY PROCEDURE [propList: PropList, prop: REF ANY, val: REF ANY] RETURNS[PropList] = { lst: PropList _ propList; lst1: PropList _ NIL; UNTIL lst = NIL DO IF lst.first.key = prop THEN BEGIN lst.first.val _ val; RETURN[propList]; END; lst1 _ lst; lst _ lst.rest; ENDLOOP; lst _ PropZone.CONS[PropZone.NEW[List.DottedPairNode _ [key: prop, val: val]], NIL]; IF lst1 = NIL THEN RETURN[lst] ELSE IF lst1.rest = NIL THEN {lst1.rest _ lst; RETURN[propList]} -- add at end -- ELSE ERROR ; -- shouldnt happen }; -- of PutPropOnList GetProp: PUBLIC PROCEDURE [atom: ATOM, prop: REF ANY] RETURNS[REF ANY] = { IF atom = NIL THEN RETURN[NIL] -- treat NIL as an atom for purposes of GetProp ELSE RETURN[GetPropFromList[propList: ATOMToPropList[atom], prop: prop]]; }; -- of GetProp GetPropFromList: PUBLIC ENTRY PROCEDURE [propList: PropList, prop: REF ANY] RETURNS[REF ANY] = { FOR lst: PropList _ propList, lst.rest UNTIL lst = NIL DO IF lst.first.key = prop THEN RETURN[lst.first.val]; ENDLOOP; RETURN[NIL]; }; -- of GetPropFromList RemProp: PUBLIC PROCEDURE [atom: ATOM, prop: REF ANY] = { IF atom = NIL THEN RETURN; ATOMToAtom[atom].propList _ RemPropFromList[ATOMToPropList[atom], prop]; }; -- of RemProp RemPropFromList: PUBLIC ENTRY PROCEDURE [propList: PropList, prop: REF ANY] RETURNS[PropList] = { lst, lst1: PropList _ NIL; lst _ propList; UNTIL lst = NIL DO IF lst.first.key = prop THEN {IF lst1 = NIL THEN RETURN[lst.rest] ELSE {lst1.rest _ lst.rest; RETURN[propList]}; }; lst1 _ lst; lst_lst.rest; ENDLOOP; RETURN[propList]; }; -- of RemPropFromList GetPName: PUBLIC PROCEDURE [atom: ATOM] RETURNS [pName: Rope.Text] = { IF atom = NIL THEN ERROR NILNotAnAtom; RETURN[ATOMToAtom[atom].pName]; }; -- of GetPName MapAtoms: PUBLIC PROCEDURE [proc: PROC[atom: ATOM]] = TRUSTED { proc1: PROCEDURE [atm: ATOM] RETURNS[stop: BOOLEAN] = CHECKED { proc[atm]; RETURN[FALSE]; }; -- of proc1 [] _ AtomsPrivate.EnumerateAtoms[callee: proc1]; }; -- of MapAtoms FindAtom: PUBLIC PROCEDURE [proc: PROC[atom: ATOM] RETURNS[stop: BOOLEAN]] RETURNS[ATOM] = TRUSTED { RETURN[AtomsPrivate.EnumerateAtoms[callee: proc]]; }; -- of FindAtom END. ͺBasicAtomImpl.Mesa. Implements basic atom and property list operations. Resides in boot file. Rest of procedures in Atom interface are exported by AtomImpl. Last Modified On January 17, 1983 1:38 pm by Warren Teitelman Types and constants bridge from opaque ATOM to concrete Atom as defined in AtomsPrivate Creating Atoms property list operations (for atoms and types) property lists are alists, rather than list of ref any, so that the property list functions do not have to check the type of each entry to make sure it is a dotted pair. When automatic narrowing arrives, then maybe want to just make property list a list of typed objects. prop not found on property list Κk– "Cedar" style˜J˜JšΟcœ™œJš>™>J˜šΟk ˜ Jšœžœ ˜Jšœ žœ$˜6Jšœžœ˜Jšœžœžœ˜"Jšœ žœ ˜˜J˜——JšΠbl œžœž˜J˜Jšžœ ˜'J˜Jšžœ˜J˜šžœ˜J˜—Jšœžœžœ˜head™JšΟnœžœ˜'Jš  œžœžœžœ˜#Jš  œžœžœ˜&J™š œžœžœ˜&JšC™C——™š   œžœžœžœ žœž˜?Jšžœžœ˜Jšœ˜—J˜š  œžœžœžœžœ˜@Jšžœžœ'˜4Jšœ˜—J˜š œžœž œžœžœžœžœ˜GJšžœ žœžœžœ ˜%Jšžœžœ˜)Jšžœ˜—J˜š œžœž œž œžœžœžœ˜NJšžœ,˜2Jšžœ˜—J˜—šœ.™.Jšœ™—˜š  œžœž œžœžœ˜EJš žœžœžœžœžœžœ/˜iJšžœ˜—J˜š œžœž œžœžœžœžœžœž˜HJšžœžœžœžœ˜&J˜`Jšžœ ˜—J˜š  œžœžœžœžœžœžœžœ ž˜nJ˜Jšœžœ˜šžœžœž˜šžœž˜Jšž˜J˜Jšžœ ˜Jšžœ˜—J˜ J˜—Jšžœ˜Jš™Jšœžœ žœ/žœ˜TJšžœžœžœžœ˜Jš žœžœ žœžœžœ ˜QJšžœžœ˜ Jšžœ˜—J˜š œžœž œžœžœžœžœžœžœž˜JJš žœžœžœžœžœ/˜NJšžœžœ>˜IJšžœ ˜—J˜š œžœžœžœžœžœžœžœž˜`šžœ$žœžœž˜9Jšžœžœžœ˜3Jšžœ˜—Jšžœžœ˜ Jšžœ˜—J˜š  œžœž œžœžœžœž˜9Jšžœžœžœžœ˜J˜HJšžœ ˜—J˜š  œžœžœžœžœžœ ž˜aJšœžœ˜J˜šžœžœž˜šžœž˜Jš œžœžœžœžœ ˜$Jšžœžœ ˜.J˜—J˜ J˜ Jšžœ˜—Jšžœ ˜Jšžœ˜—J™J˜š  œžœž œžœžœž˜FJšžœžœžœžœ˜&Jšžœ˜Jšžœ˜—J˜J˜š  œžœž œžœžœž ˜?š  œž œžœžœžœž ˜@J˜ Jšžœžœ˜Jšžœ ˜—J˜J˜0Jšžœ˜—J˜š œžœž œžœžœžœžœžœžœžœž˜dJšžœ,˜2Jšžœ˜J˜——Jšžœ˜J˜J˜J˜—…—/