-
-
Notifications
You must be signed in to change notification settings - Fork 206
/
__init__.py
111 lines (94 loc) · 4.13 KB
/
__init__.py
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
109
110
111
# -*- coding: utf8 -*-
u"""
Mathics: a general-purpose computer algebra system
Copyright (C) 2011 Jan Pöschko
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
from mathics.builtin import algebra, arithmetic, assignment, attributes, calculus, combinatorial, comparison, control, datentime, evaluation
from mathics.builtin import exptrig, functional, graphics, inout, integer, linalg, lists, logic, numbertheory, numeric, options, patterns
from mathics.builtin import plot, randomnumbers, specialfunctions, scoping, strings, structure
from mathics.builtin import tensors
from mathics.builtin.base import Builtin, SageObject, BoxConstruct, Operator, PatternObject
modules = [algebra, arithmetic, assignment, attributes, calculus, combinatorial, comparison, control, datentime, evaluation,
exptrig, functional, graphics, inout, integer, linalg, lists, logic, numbertheory, numeric, options, patterns,
plot, randomnumbers, specialfunctions, scoping, strings, structure,
tensors]
builtins = []
builtins_by_module = {}
def is_builtin(var):
if var == Builtin:
return True
if hasattr(var, '__bases__'):
return any(is_builtin(base) for base in var.__bases__)
return False
for module in modules:
builtins_by_module[module.__name__] = []
vars = dir(module)
for name in vars:
var = getattr(module, name)
if hasattr(var, '__module__') and var.__module__.startswith('mathics.builtin.') and \
var.__module__ != 'mathics.builtin.base' and is_builtin(var) and not name.startswith('_'):
instance = var(expression=False)
if isinstance(instance, Builtin):
builtins.append((instance.get_name(), instance))
builtins_by_module[module.__name__].append(instance)
#builtins = dict(builtins)
mathics_to_sage = {}
sage_to_mathics = {}
mathics_to_sympy = {}
sympy_to_mathics = {}
box_constructs = {}
pattern_objects = {}
builtins_precedence = {}
def add_builtins(new_builtins):
for var_name, builtin in new_builtins:
name = builtin.get_name()
if isinstance(builtin, SageObject):
mathics_to_sage[name] = builtin
if builtin.sage_name:
sage_to_mathics[builtin.sage_name] = builtin
for sage_name in builtin.sage_names_alt:
sage_to_mathics[sage_name] = builtin
mathics_to_sympy[name] = builtin
if builtin.sympy_name:
sympy_to_mathics[builtin.sympy_name] = builtin
if isinstance(builtin, BoxConstruct):
box_constructs[name] = builtin
if isinstance(builtin, Operator):
builtins_precedence[name] = builtin.precedence
if isinstance(builtin, PatternObject):
pattern_objects[name] = builtin.__class__
builtins.update(dict(new_builtins))
new_builtins = builtins
builtins = {}
add_builtins(new_builtins)
def get_module_doc(module):
doc = module.__doc__
if doc is not None:
doc = doc.strip()
if doc:
title = doc.splitlines()[0]
text = '\n'.join(doc.splitlines()[1:])
else:
title = module.__name__
for prefix in ('mathics.builtin.', 'mathics.optional.'):
if title.startswith(prefix):
title = title[len(prefix):]
title = title.capitalize()
text = ''
return title, text
def contribute(definitions):
# let MakeBoxes contribute first
builtins['MakeBoxes'].contribute(definitions)
for name, item in builtins.items():
if name != 'MakeBoxes':
item.contribute(definitions)