File: errors.ys

package info (click to toggle)
yacas 1.9.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 4,288 kB
  • sloc: cpp: 14,980; python: 401; makefile: 161; sh: 118; xml: 78
file content (108 lines) | stat: -rw-r--r-- 2,588 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
//////////////////////////////////////////////////
/// ErrorTableau, Assert, IsError --- global error reporting
//////////////////////////////////////////////////

LocalSymbols(ErrorTableau) [

  /// global error tableau. Its entries do not have to be lists.
  Set(ErrorTableau, {});

  GetErrorTableau() := ErrorTableau;

  ClearErrors() <-- Set(ErrorTableau, {});

  /// aux function to check for corrupt tableau
  CheckErrorTableau() <--
  If(
    Not IsList(ErrorTableau),
    Set(ErrorTableau, {{"general", "corrupted ErrorTableau"}})
  );

]; // LocalSymbols(ErrorTableau)

/// check for errors
IsError() <--
[
	CheckErrorTableau();
	Length(GetErrorTableau())>0;
];

/// check for errors of a given kind
IsError(error'class_IsString) <--
[
	CheckErrorTableau();
	GetErrorTableau()[error'class] != Empty;
];

/// post an error if assertion fails
(Assert(_error'class, _error'object) _predicate) <--
[
	CheckErrorTableau();
	If(Equals(predicate, True),	// if it does not evaluate to True, it's an error
		True,
		[	// error occurred, need to post error'object
			DestructiveAppend(GetErrorTableau(), {error'class, error'object});
			False;
		]
	);
];

/// interface
(Assert(_error'class) _predicate) <-- Assert(error'class, True) predicate;

/// interface
(Assert() _predicate) <-- Assert("generic", True) predicate;

/// print all errors and clear the tableau
DumpErrors() <--
[
	Local(error'object, error'word);
	CheckErrorTableau();
	ForEach(error'object, GetErrorTableau())
	[	// error'object might be e.g. {"critical", {"bad bad", -1000}}
		If(
			IsList(error'object),
			[
				If( // special case: error class "warning"
					Length(error'object) > 0 And error'object[1] = "warning",
					[
						error'word := "Warning";
						error'object[1] := "";	// don't print the word "warning" again
					],
					error'word := "Error: "	// important hack: insert ": " here but not after "Warning"
				);

				If(	// special case: {"error'class", True}
					Length(error'object)=2 And error'object[2]=True,
					Echo(error'word, error'object[1]),
					[
						Echo(error'word, error'object[1], ": ",
							PrintList(Tail(error'object)));
					]
				);
			],
			// error'object is not a list: just print it
			Echo("Error: ", error'object)
		);
	];
	ClearErrors();
];

/// obtain error object
GetError(error'class_IsString) <--
[
	Local(error);
	error := GetErrorTableau()[error'class];
	If(
		error != Empty,
		error,
		False
	);
];

/// delete error
ClearError(error'class_IsString) <-- AssocDelete(GetErrorTableau(), error'class);


//////////////////////////////////////////////////