Skip to content

Commit c9ac8e0

Browse files
committed
decoupling from mathics.builtin.builtins
1 parent 6481223 commit c9ac8e0

9 files changed

Lines changed: 52 additions & 41 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

@@ -107,14 +107,20 @@ def add_builtins(new_builtins):
107107
builtins_precedence[name] = builtin.precedence
108108
if isinstance(builtin, PatternObject):
109109
pattern_objects[name] = builtin.__class__
110-
builtins.update(dict(new_builtins))
110+
_builtins.update(dict(new_builtins))
111111

112112

113-
new_builtins = builtins
114-
builtins = {}
113+
new_builtins = _builtins
114+
_builtins = {}
115115
add_builtins(new_builtins)
116116

117117

118+
def builtins_dict():
119+
return { builtin.get_name() : builtin
120+
for modname, builtins in builtins_by_module.items()
121+
for builtin in builtins}
122+
123+
118124
def get_module_doc(module):
119125
doc = module.__doc__
120126
if doc is not None:
@@ -134,8 +140,8 @@ def get_module_doc(module):
134140

135141
def contribute(definitions):
136142
# let MakeBoxes contribute first
137-
builtins["System`MakeBoxes"].contribute(definitions)
138-
for name, item in builtins.items():
143+
_builtins["System`MakeBoxes"].contribute(definitions)
144+
for name, item in _builtins.items():
139145
if name != "System`MakeBoxes":
140146
item.contribute(definitions)
141147

mathics/builtin/assignment.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1751,7 +1751,7 @@ class LoadModule(Builtin):
17511751
: Python module nomodule does not exist.
17521752
= $Failed
17531753
>> LoadModule["sys"]
1754-
: Python module sys is not a pymathics module.
1754+
: Python module sys does not exist.
17551755
= $Failed
17561756
"""
17571757
name = "LoadModule"

mathics/builtin/base.py

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

110109
# Check if the given options are actually supported by the Builtin.
111110
# If not, we might issue an optx error and abort. Using '$OptionSyntax'
@@ -249,8 +248,7 @@ def contextify_form_name(f):
249248
# used, so it won't work.
250249
if option not in definitions.builtin:
251250
definitions.builtin[option] = Definition(
252-
name=name, attributes=set()
253-
)
251+
name=name, attributes=set())
254252
defaults = []
255253
for spec, value in self.defaults.items():
256254
value = parse_builtin_rule(value)

mathics/builtin/inout.py

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

2172-
from mathics.builtin import builtins
2173-
21742172
name = expr.get_name()
21752173
precedence = 1000
21762174
if name:
2177-
builtin = builtins.get(name)
2175+
builtin = evaluation.definitions.get_definition(name, only_if_exists=True)
2176+
if builtin:
2177+
builtin = builtin.builtin
21782178
if builtin is not None and isinstance(builtin, Operator):
21792179
precedence = builtin.precedence
21802180
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/builtin/system.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,11 @@ class UserName(Predefined):
407407
name = "$UserName"
408408

409409
def evaluate(self, evaluation) -> String:
410-
return String(os.getlogin())
410+
try:
411+
return String(os.getlogin())
412+
except:
413+
import pwd
414+
return String(pwd.getpwuid(os.getuid())[0])
411415

412416

413417
class Version(Predefined):

mathics/core/definitions.py

Lines changed: 5 additions & 9 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")
@@ -167,17 +162,13 @@ def load_pymathics_module(self, module, remove_on_quit=True):
167162
def clear_pymathics_modules(self):
168163
from mathics.builtin import builtins, builtins_by_module
169164

170-
# Remove all modules that are not in mathics
171-
# print("cleaning pymathics modules")
172165
for key in list(builtins_by_module.keys()):
173166
if not key.startswith("mathics."):
174-
print(f'removing module "{key}" not in mathics.')
175167
del builtins_by_module[key]
176168
for key in pymathics:
177169
del self.pymathics[key]
178170

179171
self.pymathics = {}
180-
# print("everything is clean")
181172
return None
182173

183174
def clear_cache(self, name=None):
@@ -416,10 +407,14 @@ def get_definition(self, name, only_if_exists=False) -> "Definition":
416407
builtin = self.builtin.get(name, None)
417408

418409
candidates = [user] if user else []
410+
builtin_instance = None
419411
if pymathics:
412+
builtin_instance = pymathics
420413
candidates.append(pymathics)
421414
if builtin:
422415
candidates.append(builtin)
416+
if builtin_instance is None:
417+
builtin_instance = builtin
423418

424419
definition = candidates[0] if len(candidates)==1 else None
425420
if len(candidates)>0 and not definition:
@@ -456,6 +451,7 @@ def get_definition(self, name, only_if_exists=False) -> "Definition":
456451
options=options,
457452
nvalues=sum((c.nvalues for c in candidates),[]),
458453
defaultvalues=sum((c.defaultvalues for c in candidates),[]),
454+
builtin=builtin_instance
459455
)
460456

461457
if definition is not None:

mathics/core/expression.py

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

25622562
def boxes_to_xml(self, show_string_characters=False, **options) -> str:
25632563
from mathics.core.parser import is_symbol_name
2564-
from mathics.builtin import builtins
2564+
from mathics.builtin import builtins_by_module
25652565

25662566
operators = set()
2567-
for name, builtin in builtins.items():
2568-
operator = builtin.get_operator_display()
2569-
if operator is not None:
2570-
operators.add(operator)
2567+
for modname, builtins in builtins_by_module.items():
2568+
for builtin in builtins:
2569+
# name = builtin.get_name()
2570+
operator = builtin.get_operator_display()
2571+
if operator is not None:
2572+
operators.add(operator)
25712573

25722574
text = self.value
25732575

@@ -2603,13 +2605,15 @@ def render(format, string):
26032605
return outtext
26042606

26052607
def boxes_to_tex(self, show_string_characters=False, **options) -> str:
2606-
from mathics.builtin import builtins
2608+
from mathics.builtin import builtins_by_module
26072609

26082610
operators = set()
2609-
for name, builtin in builtins.items():
2610-
operator = builtin.get_operator_display()
2611-
if operator is not None:
2612-
operators.add(operator)
2611+
2612+
for modname, builtins in builtins_by_module.items():
2613+
for builtin in builtins:
2614+
operator = builtin.get_operator_display()
2615+
if operator is not None:
2616+
operators.add(operator)
26132617

26142618
text = self.value
26152619

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)