|
36 | 36 |
|
37 | 37 |
|
38 | 38 | from mathics.builtin.base import Builtin, BinaryOperator, PostfixOperator |
39 | | -from mathics.builtin.base import PatternObject |
| 39 | +from mathics.builtin.base import PatternObject, PatternError |
40 | 40 | from mathics.builtin.lists import python_levelspec, InvalidLevelspecError |
41 | 41 |
|
42 | 42 | from mathics.core.expression import ( |
@@ -206,6 +206,8 @@ def apply_levelspec(self, expr, rules, ls, evaluation, options): |
206 | 206 | return result |
207 | 207 | except InvalidLevelspecError: |
208 | 208 | evaluation.message('General', 'level', ls) |
| 209 | + except PatternError as e: |
| 210 | + evaluation.message('Replace','reps', rules) |
209 | 211 |
|
210 | 212 |
|
211 | 213 | class ReplaceAll(BinaryOperator): |
@@ -267,13 +269,16 @@ class ReplaceAll(BinaryOperator): |
267 | 269 |
|
268 | 270 | def apply(self, expr, rules, evaluation): |
269 | 271 | 'ReplaceAll[expr_, rules_]' |
| 272 | + try: |
| 273 | + rules, ret = create_rules(rules, expr, 'ReplaceAll', evaluation) |
270 | 274 |
|
271 | | - rules, ret = create_rules(rules, expr, 'ReplaceAll', evaluation) |
272 | | - if ret: |
273 | | - return rules |
| 275 | + if ret: |
| 276 | + return rules |
274 | 277 |
|
275 | | - result, applied = expr.apply_rules(rules, evaluation) |
276 | | - return result |
| 278 | + result, applied = expr.apply_rules(rules, evaluation) |
| 279 | + return result |
| 280 | + except PatternError as e: |
| 281 | + evaluation.message('Replace','reps', rules) |
277 | 282 |
|
278 | 283 |
|
279 | 284 | class ReplaceRepeated(BinaryOperator): |
@@ -309,8 +314,12 @@ class ReplaceRepeated(BinaryOperator): |
309 | 314 |
|
310 | 315 | def apply_list(self, expr, rules, evaluation): |
311 | 316 | 'ReplaceRepeated[expr_, rules_]' |
| 317 | + try: |
| 318 | + rules, ret = create_rules(rules, expr, 'ReplaceRepeated', evaluation) |
| 319 | + except PatternError as e: |
| 320 | + evaluation.message('Replace','reps', rules) |
| 321 | + return None |
312 | 322 |
|
313 | | - rules, ret = create_rules(rules, expr, 'ReplaceRepeated', evaluation) |
314 | 323 | if ret: |
315 | 324 | return rules |
316 | 325 |
|
@@ -374,9 +383,13 @@ def apply(self, expr, rules, max, evaluation): |
374 | 383 | if max_count is None or max_count < 0: |
375 | 384 | evaluation.message('ReplaceList', 'innf', 3) |
376 | 385 | return |
| 386 | + try: |
| 387 | + rules, ret = create_rules( |
| 388 | + rules, expr, 'ReplaceList', evaluation, extra_args=[max]) |
| 389 | + except PatternError as e: |
| 390 | + evaluation.message('Replace','reps', rules) |
| 391 | + return None |
377 | 392 |
|
378 | | - rules, ret = create_rules( |
379 | | - rules, expr, 'ReplaceList', evaluation, extra_args=[max]) |
380 | 393 | if ret: |
381 | 394 | return rules |
382 | 395 |
|
@@ -1114,7 +1127,8 @@ def init(self, expr, min=1): |
1114 | 1127 | self.min = min |
1115 | 1128 | if len(expr.leaves) == 2: |
1116 | 1129 | leaf_1 = expr.leaves[1] |
1117 | | - if (leaf_1.has_form('List', 1, 2) and all(leaf.get_int_value() for leaf in leaf_1.leaves)): |
| 1130 | + allnumbers = all(not (leaf.get_int_value() is None) for leaf in leaf_1.get_leaves()) |
| 1131 | + if (leaf_1.has_form('List', 1, 2) and allnumbers ): |
1118 | 1132 | self.max = leaf_1.leaves[-1].get_int_value() |
1119 | 1133 | self.min = leaf_1.leaves[0].get_int_value() |
1120 | 1134 | elif leaf_1.get_int_value(): |
|
0 commit comments