# L-25 MCS 507 Wed 19 Oct 2011 : makefunction.py

# Executing a class definition inside a function 
# gives a tool for turning an expression defined
# in a string into a callable object.

def makefunction(formula):
   """
   Given in a string formula 
   a mathematical expression in x,
   returns a callable object.
   """
   classdefinition = """
class myfunction:

   def __init__(self,expression):
      self.formula = expression

   def __str__(self):
      return self.formula

   def __call__(self,x):
      return eval(self.formula)
"""
   exec(classdefinition)
   return myfunction(formula)

def main():
   """
   Turns the string 'x**2' into
   a function to square numbers.
   """
   f = makefunction('x**2')
   print 'made the function', f
   v = 2 
   y = f(v)
   print 'evaluated at', v, ':', y 

if __name__=="__main__": main()
