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))
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)
def visit_LetIn(self, node): sub = Substitution(self.visit(node.exp), node.var) return self.visit(sub.subst(node.body))
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)