Example #1
0
 def visit_App(self, node):
     m1 = self.visit(node.left_exp)
     if not isinstance(m1, Lambda):
         raise TypeError
     m2 = self.visit(node.right_exp)
     sub = Substitution(m2, m1.var)
     return self.visit(sub.subst(m1.exp))
Example #2
0
 def visit_App(self, node):
     m1 = node.left_exp
     m2 = node.right_exp
     try:
         return App(self.visit(m1), m2)
     except Stuck:
         if not isinstance(m1, Lambda):
             raise TypeError
         try:
             return App(m1, self.visit(m2))
         except Stuck:
             sub = Substitution(m2, m1.var)
             return sub.subst(m1.exp)
Example #3
0
 def visit_LetIn(self, node):
     sub = Substitution(self.visit(node.exp), node.var)
     return self.visit(sub.subst(node.body))
Example #4
0
 def visit_LetIn(self, node):
     try:
         return LetIn(node.var, self.visit(node.exp), node.body)
     except Stuck:
         sub = Substitution(node.exp, node.var)
         return sub.subst(node.body)