packages feed

language-Modula2-0.1: examples/Dipl/M2/LIBRARY.MOD

IMPLEMENTATION MODULE Library;
FROM Machine IMPORT closure, link, EmptyClosure, result;
FROM Machine IMPORT Reduce, NewLayer, ChangeDefinition, StartLayer, PopLayer, debug;
FROM Machine IMPORT AddEnv, AddValuedEnv, RemoveEnv, Copy, Join, Equal, Root;
FROM Machine IMPORT MakeDef, MakePrimitive, MakePacked, ExtractPacked;
FROM Machine IMPORT tempDef, HandlePackage, Build, wPackage;
FROM Machine IMPORT Build, BuildReduced;
FROM Names IMPORT DefineWord, AddArgument, AddPrimWord, AddAtom;
FROM Names IMPORT wName, wMeaning;
FROM Names IMPORT DefEntry, SetDefEntry, FindWord, vList;
FROM Memory IMPORT Collect;

CONST
	FormalLength=1000;

PROCEDURE pGetProp;
VAR
	r:link;
BEGIN
	r:=Root(wProperty^);
	NewLayer(wStruct^);
	result:=r^
END pGetProp;

PROCEDURE pAddProp;
BEGIN
	IF Root(wStruct^)=wError THEN
		result:=wStruct^
	ELSIF Root(wProperty^)=wError THEN
		result:=wProperty^
	ELSIF Root(wValue^)=wError THEN
		result:=wValue^
	ELSE
		Copy(wStruct^,result);
		AddEnv(result,Root(wProperty^),wValue^)
	END
END pAddProp;

PROCEDURE pAddValProp;
BEGIN
	IF Root(wStruct^)=wError THEN
		result:=wStruct^
	ELSIF Root(wProperty^)=wError THEN
		result:=wProperty^
	ELSIF Root(wValue^)=wError THEN
		result:=wValue^
	ELSE
		Copy(wStruct^,result);
		AddValuedEnv(result,Root(wProperty^),wValue^)
	END
END pAddValProp;

PROCEDURE pRemProp;
BEGIN
	Copy(wStruct^,result);
	RemoveEnv(result,Root(wProperty^))
END pRemProp;

PROCEDURE pJoin;
BEGIN
	IF Root(wStruct^)=wError THEN
		result:=wStruct^
	ELSIF Root(wDescription^)=wError THEN
		result:=wDescription^
	ELSE
		Copy(wStruct^,result);
		Join(result,wDescription^)
	END
END pJoin;

PROCEDURE pCopy;
BEGIN
	result:=Root(wProperty^)^
END pCopy;

PROCEDURE pQuote;
BEGIN
	result:=wStruct^
END pQuote;

PROCEDURE pVain;
BEGIN
	result:=wAncestor^
END pVain;

PROCEDURE pGetType;
BEGIN
	MakeDef(result,Root(wStruct^))
END pGetType;

PROCEDURE pIsOfClass;
BEGIN
	IF Root(wStruct^)=Root(wType^) THEN
		MakeDef(result,wTrue)
	ELSE
		MakeDef(result,wFalse)
	END
END pIsOfClass;

PROCEDURE pEqual;
BEGIN
	IF Equal(wArg1^,wArg2^) THEN
		MakeDef(result,wTrue)
	ELSE
		MakeDef(result,wFalse)
	END
END pEqual;

PROCEDURE pNot;
VAR
	l:BOOLEAN;
BEGIN
	IF Root(wArg1^)=wTrue THEN
		MakeDef(result,wFalse)
	ELSIF Root(wTest^)=wFalse THEN
		MakeDef(result,wTrue)
	ELSE
		MakePacked(result,wError,NotLogicalType)
	END
END pNot;

PROCEDURE pAnd;
VAR
	l:BOOLEAN;
BEGIN
	IF Root(wArg1^)=wTrue THEN
		Reduce(wArg2^)
	ELSIF Root(wTest^)=wFalse THEN
		MakeDef(result,wFalse)
	ELSE
		MakePacked(result,wError,NotLogicalType)
	END
END pAnd;

PROCEDURE pOr;
VAR
	l:BOOLEAN;
BEGIN
	IF Root(wArg1^)=wFalse THEN
		Reduce(wArg2^)
	ELSIF Root(wTest^)=wTrue THEN
		MakeDef(result,wTrue)
	ELSE
		MakePacked(result,wError,NotLogicalType)
	END
END pOr;

PROCEDURE pIf;
VAR
	l:BOOLEAN;
BEGIN
	Reduce(wTest^);
	IF Root(result)=wTrue THEN
		Reduce(wYes^)
	ELSIF Root(wTest^)=wFalse THEN
		Reduce(wNo^)
	ELSE
		MakePacked(result,wError,NotLogicalType)
	END
END pIf;

PROCEDURE ExtractNumbers(VAR x,y:INTEGER):BOOLEAN;
BEGIN
	Reduce(wArg1^);
	IF Root(result)#wNumber THEN
		IF Root(result)#wError THEN
			MakePacked(result,wError,NotNumberType)
		END;
		RETURN FALSE
	END;
	ExtractPacked(result,x);
	
	Reduce(wArg2^);
	IF Root(result)#wNumber THEN
		IF Root(result)#wError THEN
			MakePacked(result,wError,NotNumberType)
		END;
		RETURN FALSE
	END;
	ExtractPacked(result,y);
	RETURN TRUE
END ExtractNumbers;

PROCEDURE pAdd;
VAR
	x,y:INTEGER;
BEGIN
	IF ExtractNumbers(x,y) THEN
		MakePacked(result,wNumber,x+y)
	END
END pAdd;

PROCEDURE pSub;
VAR
	x,y:INTEGER;
BEGIN
	IF ExtractNumbers(x,y) THEN
		MakePacked(result,wNumber,x-y)
	END
END pSub;

PROCEDURE pMul;
VAR
	x,y:INTEGER;
BEGIN
	IF ExtractNumbers(x,y) THEN
		MakePacked(result,wNumber,x*y)
	END
END pMul;

PROCEDURE pDiv;
VAR
	x,y:INTEGER;
BEGIN
	IF ExtractNumbers(x,y) THEN
		MakePacked(result,wNumber,x DIV y)
	END
END pDiv;

PROCEDURE pFind;
VAR
	s:POINTER TO ARRAY [0..FormalLength] OF CHAR;
	l:link;
BEGIN
	Reduce(wName^);
	IF Root(result)#wString THEN
		IF Root(result)#wError THEN
			MakePacked(result,wError,NotStringType)
		END;
		RETURN
	END;
	ExtractPacked(result,s);
	l:=FindWord(s^);
	IF l=NIL THEN
		MakePacked(result,wError,NotFound)
	ELSE
		NewLayer(DefEntry(l));
		result:=wMeaning^
	END
END pFind;

PROCEDURE pAssociate;
VAR
	entry:closure;
BEGIN
	Copy(DefEntry(Root(wName^)),tempDef);
	AddEnv(tempDef,Root(wProperty^),wValue^);
	SetDefEntry(Root(wName^),tempDef);
	tempDef:=EmptyClosure;
	Reduce(wStruct^)
END pAssociate;

PROCEDURE pWordEntry;
BEGIN
	result:=DefEntry(Root(wStruct^))
END pWordEntry;

PROCEDURE pDebug;
BEGIN
	debug:=TRUE;
	Reduce(wStruct^);
	debug:=FALSE
END pDebug;

PROCEDURE pCollect;
BEGIN
	Collect;
	Reduce(wStruct^)
END pCollect;

PROCEDURE pAbort;
BEGIN
	HALT
END pAbort;

PROCEDURE pVList;
BEGIN
	vList;
	MakeDef(result,wTrue)
END pVList;

BEGIN
	DefineWord(wChar, 'CHAR', HandlePackage);
	DefineWord(wError, 'ERROR', HandlePackage);
	DefineWord(wNumber, 'NUMBER', HandlePackage);
	DefineWord(wCharSet, 'CharSET', HandlePackage);

	AddArgument(wPackage, 'Package');
	DefineWord(wPacked, 'Packed', HandlePackage);

	AddArgument(wCar, 'Car');
	AddArgument(wCdr, 'Cdr');
	AddAtom(wNil, 'Nil');

	AddPrimWord(wCons, 'Cons', Build);
	MakeDef(tempDef,wCons);
	AddEnv(wCons^,wType,tempDef);
	MakeDef(tempDef,wCar);
	AddValuedEnv(wCons^,wCar,tempDef);
	MakeDef(tempDef,wCdr);
	AddValuedEnv(wCons^,wCdr,tempDef);
	tempDef:=EmptyClosure;

	AddPrimWord(wJoin, 'Join', pJoin);
	AddPrimWord(wGetType, 'GetType', pGetType);
	AddPrimWord(wGetProp, 'PropertyValue', pGetProp);
	AddPrimWord(wAddValProp, 'AddValuedProperty', pAddValProp);
	AddPrimWord(wAddProp, 'AddProperty', pAddProp);
	AddPrimWord(wRemProp, 'RemoveProperty', pRemProp);
	AddPrimWord(wCopy, 'Copy', pCopy);
	AddPrimWord(wIsOfClass, 'IsOfClass', pIsOfClass);
	AddPrimWord(wEqual, 'Equal', pEqual);
	AddPrimWord(wQuote, 'Quote', pQuote);
	AddPrimWord(wBuild, 'Build', Build);
	AddPrimWord(wBuild, 'BuildReduced', BuildReduced);
	AddPrimWord(wVain, 'Vain', pVain);

	AddArgument(wDescription, 'Description');
	AddArgument(wStruct, 'Struct');
	AddArgument(wProperty, 'Property');
	AddArgument(wValue, 'Value');
	AddArgument(wType, 'Type');
	AddArgument(wAncestor, 'Ancestor');
	
	AddAtom(wDummy, 'Dummy');
	AddAtom(wTrue, 'True');
	AddAtom(wFalse, 'False');
	AddPrimWord(wAnd, 'And', pAnd);
	AddPrimWord(wOr, 'Or', pOr);
	AddPrimWord(wNot, 'Not', pNot);
	AddPrimWord(wIf, 'If', pIf);
	AddArgument(wTest, 'Test');
	AddArgument(wYes, 'Yes');
	AddArgument(wNo, 'No');
	AddArgument(wArg1, 'Arg1');
	AddArgument(wArg2, 'Arg2');
	AddArgument(wFile, 'File');

	AddPrimWord(wAdd, 'Add', pAdd);
	AddPrimWord(wSub, 'Sub', pSub);
	AddPrimWord(wMul, 'Mul', pMul);
	AddPrimWord(wDiv, 'Div', pDiv);
	
	AddPrimWord(wFind, 'Find', pFind);
	AddPrimWord(wWordEntry, 'WordEntry', pWordEntry);
	AddPrimWord(wAssociate, 'Associate', pAssociate);
	
	AddPrimWord(wDebug, 'Debug', pDebug);
	AddPrimWord(wCollect, 'Collect', pCollect);
	AddPrimWord(wAbort, 'Abort', pAbort);
	AddPrimWord(wVList, 'VList', pVList)
END Library.