ColorsImpl:
CEDAR
PROGRAM
IMPORTS Atom, IO, Convert, ImagerColor, AlgebraClasses, MathConstructors
EXPORTS Colors =
Errors
SyntaxError: PUBLIC ERROR [reason: ATOM] = CODE;
BadElementStructure: PUBLIC ERROR [elementStructure: AC.Structure] = CODE;
TypeError: PUBLIC ERROR [message: ATOM ← $Unspecified] = CODE;
Class for Color Structures
ClassPrintName:
AC.PrintNameProc = {
RETURN["Colors"];
};
ClassShortPrintName:
AC.PrintNameProc = {
RETURN["Colors"];
};
ClassIsElementOf:
AC.ElementOfProc = {
Assumes that if item is a color, then it really belongs to the domain pointed to by its structure field.
IF NOT structure.class.structureEqual[structure, item.structure] THEN RETURN[FALSE];
RETURN[ TRUE ]
};
ClassLegalFirstChar:
AC.LegalFirstCharOp = {
SELECT char
FROM
IN ['A..'Z] => RETURN[TRUE];
ENDCASE;
RETURN[FALSE];
};
ClassToExpr:
AC.ToExprOp = {
inData: ColorData;
IF in=
NIL
THEN {
out ← MathConstructors.MakeVariable["NilColor"];
RETURN;
};
inData ← NARROW[in.data];
IF inData=
NIL
THEN {
out ← MathConstructors.MakeVariable["NilColor"];
RETURN;
};
out ← MathConstructors.MakeVariable[inData.name];
};
colorProp: Atom.DottedPair ← NEW[Atom.DottedPairNode← [$ColorStructure, NIL]];
colorStructureClass:
AC.StructureClass ←
NEW[
AC.StructureClassRec ← [
category: set,
printName: ClassPrintName,
shortPrintName: ClassShortPrintName,
structureEqual: AC.defaultStructureEqualityTest,
isElementOf: ClassIsElementOf,
legalFirstChar: ClassLegalFirstChar,
read: Read,
fromRope: FromRope,
toRope: ToRope,
toIndexRope: ToRope,
write: Write,
toExpr: ClassToExpr,
integralDomain: FALSE,
gcdDomain: FALSE,
euclideanDomain: FALSE,
propList: LIST[colorProp]
] ];
Colors:
PUBLIC
AC.Structure ←
NEW[
AC.StructureRec ← [
class: colorStructureClass,
instanceData: NIL
] ];
Conversion and IO
Read:
PUBLIC
AC.ReadOp ~ {
token: Rope.ROPE ← in.GetID[];
atom: ATOM ← Convert.AtomFromRope[token];
outData: ColorData ←
NEW[ColorDataRec ← [
name: token,
value: ImagerColor.ColorFromAtom[atom]
] ];
out ← NEW[AC.ObjectRec ← [structure: structure, data: outData] ];
RETURN[out];
};
FromRope:
PUBLIC
AC.FromRopeOp ~ {
out ← Read[IO.RIS[in], structure];
};
ToRope:
PUBLIC
AC.ToRopeOp ~ {
inData: ColorData;
IF in=NIL THEN RETURN["NilColor"];
inData ← NARROW[in.data];
IF inData=NIL THEN RETURN["NilColor"];
out ← inData.name;
};
Write:
PUBLIC
AC.WriteOp ~ {
stream.PutRope[ToRope[in] ]
};