class Expr:
def __add__(self, other):
return Plus(self, other)
def __mul__(self, other):
return Times(self, other)
class Int(Expr):
def __init__(self, n):
self.n = n
def d(self, v):
return Int(0)
def __str__(self):
return `self.n`
class Var(Expr):
def __init__(self, var):
self.var = var
def d(self, v):
return Int(self.var == v and 1 or 0)
def __str__(self):
return self.var
class Plus(Expr):
def __init__(self, a, b):
self.e1 = a
self.e2 = b
def d(self, v):
return Plus(self.e1.d(v), self.e2.d(v))
def __str__(self):
return "(%s + %s)" % (self.e1, self.e2)
class Times(Expr):
def __init__(self, a, b):
self.e1 = a
self.e2 = b
def d(self, v):
return Plus(Times(self.e1, self.e2.d(v)), Times(self.e1.d(v), self.e2))
def __str__(self):
return "(%s * %s)" % (self.e1, self.e2)
if __name__ == "__main__":
x = Var("x")
a = Var("a")
b = Var("b")
c = Var("c")
e = a * x * x + b * x + c
print "d(%s, x) = %s" % (e, e.d("x"))