Skip to content

Commit 338894c

Browse files
committed
Merge branch 'informationfix' into makeboxesoverhault
2 parents 82eaa72 + cb0f619 commit 338894c

7 files changed

Lines changed: 47 additions & 40 deletions

File tree

mathics/builtin/__init__.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
continue
4444
modules.append(module)
4545

46-
builtins = []
46+
_builtins = []
4747
builtins_by_module = {}
4848

4949

@@ -75,7 +75,7 @@ def is_builtin(var):
7575
# This set the default context for symbols in mathics.builtins
7676
if not type(instance).context:
7777
type(instance).context = "System`"
78-
builtins.append( (instance.get_name(), instance))
78+
_builtins.append( (instance.get_name(), instance))
7979
builtins_by_module[module.__name__].append(instance)
8080

8181

@@ -104,14 +104,20 @@ def add_builtins(new_builtins):
104104
builtins_precedence[name] = builtin.precedence
105105
if isinstance(builtin, PatternObject):
106106
pattern_objects[name] = builtin.__class__
107-
builtins.update(dict(new_builtins))
107+
_builtins.update(dict(new_builtins))
108108

109109

110-
new_builtins = builtins
111-
builtins = {}
110+
new_builtins = _builtins
111+
_builtins = {}
112112
add_builtins(new_builtins)
113113

114114

115+
def builtins_dict():
116+
return { builtin.get_name() : builtin
117+
for modname, builtins in builtins_by_module.items()
118+
for builtin in builtins}
119+
120+
115121
def get_module_doc(module):
116122
doc = module.__doc__
117123
if doc is not None:
@@ -131,8 +137,8 @@ def get_module_doc(module):
131137

132138
def contribute(definitions):
133139
# let MakeBoxes contribute first
134-
builtins["System`MakeBoxes"].contribute(definitions)
135-
for name, item in builtins.items():
140+
_builtins["System`MakeBoxes"].contribute(definitions)
141+
for name, item in _builtins.items():
136142
if name != "System`MakeBoxes":
137143
item.contribute(definitions)
138144

mathics/builtin/base.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,7 @@ def contribute(self, definitions, is_pymodule=False):
102102
# used, so it won't work.
103103
if option not in definitions.builtin:
104104
definitions.builtin[option] = Definition(
105-
name=name, attributes=set()
106-
)
105+
name=name, attributes=set())
107106

108107
# Check if the given options are actually supported by the Builtin.
109108
# If not, we might issue an optx error and abort. Using '$OptionSyntax'
@@ -247,8 +246,7 @@ def contextify_form_name(f):
247246
# used, so it won't work.
248247
if option not in definitions.builtin:
249248
definitions.builtin[option] = Definition(
250-
name=name, attributes=set()
251-
)
249+
name=name, attributes=set())
252250
defaults = []
253251
for spec, value in self.defaults.items():
254252
value = parse_builtin_rule(value)

mathics/builtin/inout.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2174,12 +2174,12 @@ class Precedence(Builtin):
21742174
def apply(self, expr, evaluation) -> Real:
21752175
'Precedence[expr_]'
21762176

2177-
from mathics.builtin import builtins
2178-
21792177
name = expr.get_name()
21802178
precedence = 1000
21812179
if name:
2182-
builtin = builtins.get(name)
2180+
builtin = evaluation.definitions.get_definition(name, only_if_exists=True)
2181+
if builtin:
2182+
builtin = builtin.builtin
21832183
if builtin is not None and isinstance(builtin, Operator):
21842184
precedence = builtin.precedence
21852185
else:

mathics/builtin/patterns.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ def init(self, expr):
429429
self.test = expr.leaves[1]
430430
self.test_name = self.test.get_name()
431431

432-
def quick_pattern_test(self, candidate, test):
432+
def quick_pattern_test(self, candidate, test, evaluation):
433433
if test == 'System`NumberQ':
434434
return isinstance(candidate, Number)
435435
elif test == 'System`Negative':
@@ -448,10 +448,11 @@ def quick_pattern_test(self, candidate, test):
448448
isinstance(candidate.leaves[1], (Integer, Rational, Real)) and
449449
candidate.leaves[1].value < 0)
450450
else:
451-
from mathics.builtin import builtins
452451
from mathics.builtin.base import Test
453-
454-
builtin = builtins.get(test)
452+
builtin = None
453+
builtin = evaluation.definitions.get_definition(test)
454+
if builtin:
455+
builtin = builtin.builtin
455456
if builtin is not None and isinstance(builtin, Test):
456457
return builtin.test(candidate)
457458
return None
@@ -462,7 +463,7 @@ def yield_match(vars_2, rest):
462463
items = expression.get_sequence()
463464
for item in items:
464465
item = item.evaluate(evaluation)
465-
quick_test = self.quick_pattern_test(item, self.test_name)
466+
quick_test = self.quick_pattern_test(item, self.test_name, evaluation)
466467
if quick_test is not None:
467468
if not quick_test:
468469
break

mathics/core/definitions.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,8 @@ def __init__(
8282
)
8383
except PyMathicsLoadException as e:
8484
raise
85-
# print(e.module + " is not a valid pymathics module.")
86-
#continue
8785
except ImportError as e:
8886
raise
89-
#print(e.__repr__())
90-
#continue
91-
# print(module + loaded_module.pymathics_version_data['version'] + " by " + loaded_module.pymathics_version_data['author'])
9287

9388
if builtin_filename is not None:
9489
builtin_file = open(builtin_filename, "wb")
@@ -120,7 +115,7 @@ def load_pymathics_module(self, module, remove_on_quit=True):
120115
from an external Python module in the pymathics module namespace.
121116
"""
122117
import importlib
123-
from mathics.builtin import is_builtin, builtins, builtins_by_module, Builtin
118+
from mathics.builtin import is_builtin, builtins_by_module, Builtin
124119
# Ensures that the pymathics module be reloaded
125120
import sys
126121
if module in sys.modules:
@@ -173,17 +168,13 @@ def load_pymathics_module(self, module, remove_on_quit=True):
173168
def clear_pymathics_modules(self):
174169
from mathics.builtin import builtins, builtins_by_module
175170

176-
# Remove all modules that are not in mathics
177-
# print("cleaning pymathics modules")
178171
for key in list(builtins_by_module.keys()):
179172
if not key.startswith("mathics."):
180-
print(f'removing module "{key}" not in mathics.')
181173
del builtins_by_module[key]
182174
for key in pymathics:
183175
del self.pymathics[key]
184176

185177
self.pymathics = {}
186-
# print("everything is clean")
187178
return None
188179

189180
def clear_cache(self, name=None):
@@ -422,10 +413,14 @@ def get_definition(self, name, only_if_exists=False) -> "Definition":
422413
builtin = self.builtin.get(name, None)
423414

424415
candidates = [user] if user else []
416+
builtin_instance = None
425417
if pymathics:
418+
builtin_instance = pymathics
426419
candidates.append(pymathics)
427420
if builtin:
428421
candidates.append(builtin)
422+
if builtin_instance is None:
423+
builtin_instance = builtin
429424

430425
definition = candidates[0] if len(candidates)==1 else None
431426
if len(candidates)>0 and not definition:
@@ -462,6 +457,7 @@ def get_definition(self, name, only_if_exists=False) -> "Definition":
462457
options=options,
463458
nvalues=sum((c.nvalues for c in candidates),[]),
464459
defaultvalues=sum((c.defaultvalues for c in candidates),[]),
460+
builtin=builtin_instance
465461
)
466462

467463
if definition is not None:

mathics/core/expression.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2540,13 +2540,15 @@ def boxes_to_text(self, show_string_characters=False, **options) -> str:
25402540

25412541
def boxes_to_xml(self, show_string_characters=False, **options) -> str:
25422542
from mathics.core.parser import is_symbol_name
2543-
from mathics.builtin import builtins
2543+
from mathics.builtin import builtins_by_module
25442544

25452545
operators = set()
2546-
for name, builtin in builtins.items():
2547-
operator = builtin.get_operator_display()
2548-
if operator is not None:
2549-
operators.add(operator)
2546+
for modname, builtins in builtins_by_module.items():
2547+
for builtin in builtins:
2548+
# name = builtin.get_name()
2549+
operator = builtin.get_operator_display()
2550+
if operator is not None:
2551+
operators.add(operator)
25502552

25512553
text = self.value
25522554

@@ -2582,13 +2584,15 @@ def render(format, string):
25822584
return outtext
25832585

25842586
def boxes_to_tex(self, show_string_characters=False, **options) -> str:
2585-
from mathics.builtin import builtins
2587+
from mathics.builtin import builtins_by_module
25862588

25872589
operators = set()
2588-
for name, builtin in builtins.items():
2589-
operator = builtin.get_operator_display()
2590-
if operator is not None:
2591-
operators.add(operator)
2590+
2591+
for modname, builtins in builtins_by_module.items():
2592+
for builtin in builtins:
2593+
operator = builtin.get_operator_display()
2594+
if operator is not None:
2595+
operators.add(operator)
25922596

25932597
text = self.value
25942598

mathics/test.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
from mathics.core.definitions import Definitions
1414
from mathics.core.evaluation import Evaluation, Output
1515
from mathics.core.parser import MathicsSingleLineFeeder
16-
from mathics.builtin import builtins
16+
from mathics.builtin import builtins_dict
17+
18+
builtins = builtins_dict()
1719

1820
from mathics import version_string
1921
from mathics import settings

0 commit comments

Comments
 (0)