source: git/modules/openmathserver/objects.py @ bb3e2b0

spielwiese
Last change on this file since bb3e2b0 was bb3e2b0, checked in by Michael Brickenstein <bricken@…>, 18 years ago
*bricken: having fantastic fun git-svn-id: file:///usr/local/Singular/svn/trunk@8361 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 6.8 KB
Line 
1from omexceptions import *
2from exceptions import *
3#from cd import *
4class XMLattribute(object):
5    def __init__(self, name, value):
6        self.name=name
7        self.value=value
8    def encode(self, context):
9        return "".join([self.name,"=\"",self.value,"\""])
10class OMobject(object):
11    """ at the moment only a base class"""
12    def __init__(self):
13        self.attributes={}
14    def __getChildren(self):
15        try:
16            return self.getChildren()
17        except AttributeError:
18            try:
19                return self.__children
20            except AttributeError:
21                return []
22    def __delChildren(self):
23        try:
24            self.delChildren()
25            return
26        except AttributeError:
27            try:
28                del self.__children
29            except AttributeError:
30                pass
31    def __setChildren(self,children):
32        try:
33            self.setChildren(children)
34        except AttributeError:
35                self.__children=children
36    def __getBody(self):
37        try:
38            return self.getBody()
39        except AttributeError:
40            try:
41                return self.__body
42            except AttributeError:
43                return None
44    def __delBody(self):
45        try:
46            self.delBody()
47            return
48        except AttributeError:
49            try:
50                del self.__body
51            except AttributeError:
52                pass
53    def __setBody(self,body):
54        try:
55            self.setBody(body)
56        except AttributeError:
57                self.__body=body
58    def __getXMLattributes(self):
59        try:
60            return self.getXMLattributes()
61        except AttributeError:
62            try:
63                return self.__XMLattributes
64            except AttributeError:
65                #do return None, cause if modifiying a new list, changes will not be saved
66                return []
67    def __delXMLattributes(self):
68        try:
69            self.delXMLattributes()
70            return
71        except AttributeError:
72            try:
73                del self.__XMLattributes
74            except AttributeError:
75                pass
76    def __setXMLattributes(self,XMLattributes):
77        try:
78            self.setBody(XMLattributes)
79        except AttributeError:
80                self.__XMLattributes=XMLattributes
81    children=property(__getChildren, __setChildren,__delChildren,\
82                      """ children in an OMtree""")
83    body=property(__getBody,__setBody,__delBody,\
84        "xml body,FIXME: at the moment only char data")
85    XMLattributes=property(__getXMLattributes,__setXMLattributes,__delXMLattributes,\
86        "xml attributes")
87    def XMLencode(self, context):
88       
89        attr=self.XMLattributes
90        if attr:
91            attrstr=" "+" ".join([a.encode(context) for a in attr])
92        else:
93            attrstr=""
94        opening="".join(["<", self.XMLtag, attrstr,">"])
95        children=self.children
96        if children:
97            body="".join([context.XMLencode(c) for c in children])
98        else:
99            body=self.body
100            if not body:
101                body=""
102            assert body!=None
103            body=context.XMLEncodeBody(body)
104            assert body!=None
105        closing="".join(["</"+self.XMLtag+">"])
106        return "".join([opening,body,closing])
107class OMvar(OMobject):
108    def __init__(self,name):
109        super(OMvar,self).__init__()
110        self.name=name
111    def evaluate(self,context):
112        try:
113            return context[self.name]
114        except OutOfScopeError:
115            return self
116    def __str__(self):
117        return "OMV(" + self.name +")"
118    XMLtag="OMV"
119    def getXMLattributes(self):
120        return [XMLattribute("name", self.name)]
121class OMapplication(OMobject):
122    def __init__(self, func, args):
123        super(OMapplication,self).__init__()
124        self.func=func
125        self.args=args
126    def evaluate(self,context):
127        efunc=context.evaluate(self.func)
128        eargs=[context.evaluate(a) for a in self.args]
129        if callable(efunc):
130            try:
131                return context.apply(efunc, eargs)
132            except EvaluationFailedError, NotImplementedError:
133                return self
134        else:
135            return OMapplication(efunc, eargs)
136class OMsymbol(OMobject):
137    def __init__(self,name,cd=None):
138        super(OMsymbol,self).__init__()
139        self.cd=cd
140        self.name=name
141    def __eq__(self, other):
142        return bool(other.name==self.name and self.cd==other.cd)
143    def __str__(self):
144        return "OMS("+self.name+", "+self.cd.name + ")"
145    def __hash__(self):#
146        return hash((self.name,self.cd.__hash__()))
147    def evaluate(self,context):
148        return context.evaluateSymbol(self)
149class SimpleValue(OMobject):
150    def __init__(self,value):
151        super(SimpleValue,self).__init__()
152        if (isinstance(value, str)):
153            value=self.parse(value)
154        self.value=value
155    def evaluate(self, context):
156        return self
157    def getValue(self):
158        return self.value
159    def __str__(self):
160        return "OM("+repr(self.value)+")"
161
162class OMint(SimpleValue):
163    def __init__(self,value):
164        super(OMint,self).__init__(value)
165    def parse(self,value):
166        """FIXME: Not fully standard compliant,
167        -> hex encodings"""
168        return int(value,10)
169    def __str__(self):
170        return "OMint("+repr(self.value)+")"
171    def getBody(self):
172        return str(self.value)
173    def setBody(self, value):
174        raise OperationNotPossibleError
175    XMLtag="OMI"
176class OMfloat(SimpleValue):
177    def __init__(self,value):
178        super(OMfloat,self).__init__(value)
179    def parse(self, value):
180        """FIXME: Not fully standard compliant,
181        -> hex encodings"""
182        return float(value)
183    def __str__(self):
184        return "OMfloat("+repr(self.value)+")"
185       
186if __name__=='__main__':
187    from context import *
188
189    from binding import *
190
191    context=Context()
192
193    context.push({})
194
195    context["x"]=OMint(1)
196
197    x=OMvar("x")
198
199    y=OMvar("y")
200
201    print context.evaluate(x)
202    print context.evaluate(y)
203    firstArg=OMbinding(lambdasym,[OMvar("x"), OMvar("y")], OMvar("x"))
204    #print context.evaluate(firstArg)
205    application=OMapplication(firstArg, [x,y])
206    print context.evaluate(application)
207    application=OMapplication(firstArg,[y,x])
208    print context.evaluate(application)
209    import arith1
210    context.addCDImplementation(arith1.implementation)
211    #print type(context.lookupImplementation(arith1.plussym))
212    #application=OMapplication(arith1.plussym,[x])
213    #application=OMapplication(arith1.plussym,[x,x])
214    application=OMapplication(OMsymbol("plus",arith1.content),[x,x])
215   
216    print context.evaluate(application)
217    application=OMapplication(OMsymbol("plus",arith1.content),[x,x,x])
218   
219    print context.evaluate(application)
220    i=OMint(22482489)
221    print i.body
222    print i.XMLencode(context)
223    #i.body="dshj"
224   
Note: See TracBrowser for help on using the repository browser.