|
3 | 3 | # -*- coding: utf-8 -*- |
4 | 4 |
|
5 | 5 |
|
| 6 | +import ast |
6 | 7 | import sympy |
7 | 8 | import mpmath |
8 | 9 | import math |
| 10 | +import inspect |
9 | 11 | import re |
10 | 12 |
|
11 | 13 | import typing |
@@ -135,10 +137,10 @@ def __ge__(self, other) -> bool: |
135 | 137 | return self.get_sort_key() >= other.get_sort_key() |
136 | 138 |
|
137 | 139 | def __eq__(self, other) -> bool: |
138 | | - return self.get_sort_key() == other.get_sort_key() |
| 140 | + return hasattr(other, "get_sort_key") and self.get_sort_key() == other.get_sort_key() |
139 | 141 |
|
140 | 142 | def __ne__(self, other) -> bool: |
141 | | - return self.get_sort_key() != other.get_sort_key() |
| 143 | + return (not hasattr(other, "get_sort_key")) or self.get_sort_key() != other.get_sort_key() |
142 | 144 |
|
143 | 145 |
|
144 | 146 | # ExpressionCache keeps track of the following attributes for one Expression instance: |
@@ -937,20 +939,32 @@ def to_python(self, *args, **kwargs): |
937 | 939 | numbers -> Python number |
938 | 940 | If kwarg n_evaluation is given, apply N first to the expression. |
939 | 941 | """ |
| 942 | + from mathics.builtin.base import mathics_to_python |
940 | 943 |
|
941 | 944 | n_evaluation = kwargs.get('n_evaluation') |
942 | 945 | if n_evaluation is not None: |
943 | 946 | value = Expression('N', self).evaluate(n_evaluation) |
944 | 947 | return value.to_python() |
945 | 948 | head_name = self._head.get_name() |
946 | | - if head_name == 'System`List': |
947 | | - return [leaf.to_python(*args, **kwargs) for leaf in self._leaves] |
948 | 949 | if head_name == 'System`DirectedInfinity' and len(self._leaves) == 1: |
949 | 950 | direction = self._leaves[0].get_int_value() |
950 | 951 | if direction == 1: |
951 | | - return float('inf') |
| 952 | + return math.inf |
952 | 953 | if direction == -1: |
953 | | - return -float('inf') |
| 954 | + return -math.inf |
| 955 | + elif head_name == 'System`List': |
| 956 | + return [leaf.to_python(*args, **kwargs) for leaf in self._leaves] |
| 957 | + if head_name in mathics_to_python: |
| 958 | + py_obj = mathics_to_python[head_name] |
| 959 | + # Start here |
| 960 | + # if inspect.isfunction(py_obj) or inspect.isbuiltin(py_obj): |
| 961 | + # args = [leaf.to_python(*args, **kwargs) for leaf in self._leaves] |
| 962 | + # return ast.Call( |
| 963 | + # func=py_obj.__name__, |
| 964 | + # args=args, |
| 965 | + # keywords=[], |
| 966 | + # ) |
| 967 | + return py_obj |
954 | 968 | return self |
955 | 969 |
|
956 | 970 | def get_sort_key(self, pattern_sort=False): |
@@ -1785,8 +1799,10 @@ def to_python(self, *args, **kwargs): |
1785 | 1799 | value = Expression('N', self).evaluate(n_evaluation) |
1786 | 1800 | return value.to_python() |
1787 | 1801 |
|
1788 | | - # return name as string (Strings are returned with quotes) |
1789 | | - return self.name |
| 1802 | + if kwargs.get("python_form", False): |
| 1803 | + return self.to_sympy(**kwargs) |
| 1804 | + else: |
| 1805 | + return self.name |
1790 | 1806 |
|
1791 | 1807 | def default_format(self, evaluation, form) -> str: |
1792 | 1808 | return self.name |
@@ -2614,6 +2630,19 @@ def __getnewargs__(self): |
2614 | 2630 | return (self.value,) |
2615 | 2631 |
|
2616 | 2632 |
|
| 2633 | +class StringFromPython(String): |
| 2634 | + def __new__(cls, value): |
| 2635 | + self = super(StringFromPython, cls).__new__(cls, value) |
| 2636 | + if isinstance(value, sympy.NumberSymbol): |
| 2637 | + self.value = "sympy." + str(value) |
| 2638 | + |
| 2639 | + # Note that the test is done with math.inf first. |
| 2640 | + # This is to use float's ==, which may not strictly be necessary. |
| 2641 | + if math.inf == value: |
| 2642 | + self.value = "math.inf" |
| 2643 | + return self |
| 2644 | + |
| 2645 | + |
2617 | 2646 | def get_default_value(name, evaluation, k=None, n=None): |
2618 | 2647 | pos = [] |
2619 | 2648 | if k is not None: |
|
0 commit comments