def visit_power_node(self, node):
     if type(self.visit(node.node_a).value) == str or type(
             self.visit(node.node_b).value) == str:
         return Letter(
             f"({self.visit(node.node_a).value}) ^ ({self.visit(node.node_b).value})"
         )
     return Number(
         self.visit(node.node_a).value**self.visit(node.node_b).value)
 def visit_multiply_node(self, node):
     if type(self.visit(node.node_a).value) == str or type(
             self.visit(node.node_b).value) == str:
         return Letter(
             f"{self.visit(node.node_a).value} * {self.visit(node.node_b).value}"
         )
     return Number(
         self.visit(node.node_a).value * self.visit(node.node_b).value)
 def visit_subtract_node(self, node):
     if type(self.visit(node.node_a).value) == str or type(
             self.visit(node.node_b).value) == str:
         return Letter(
             f"{self.visit(node.node_a).value} - {self.visit(node.node_b).value}"
         )
     return Number(
         self.visit(node.node_a).value - self.visit(node.node_b).value)
 def visit_add_node(self, node):
     if type(self.visit(node.node_a).value) == str or type(
             self.visit(node.node_b).value) == str:
         return Letter(
             f"{self.visit(node.node_a).value} + {self.visit(node.node_b).value}"
         )
     return Number(
         self.visit(node.node_a).value + self.visit(node.node_b).value)
 def visit_divide_node(self, node):
     if self.visit(node.node_b).value == 0.0:
         print(node)
     elif type(self.visit(node.node_a).value) == str or type(
             self.visit(node.node_b).value) == str:
         return Letter(
             f"{self.visit(node.node_a).value} / {self.visit(node.node_b).value}"
         )
     try:
         return Number(
             self.visit(node.node_a).value / self.visit(node.node_b).value)
     except Exception:
         raise Exception("Runtime math error")
 def visit_square_node(self, node):
     if type(self.visit(node.node).value) == str:
         return Letter(f"sqrt({self.visit(node.node)})")
     return Number(sqrt(self.visit(node.node).value))
 def visit_exponent_node(self, node):
     if type(self.visit(node.node).value) == str:
         return Letter(f"exp({self.visit(node.node)})")
     return Number(exp(self.visit(node.node).value))
 def visit_cosinus_node(self, node):
     if type(self.visit(node.node).value) == str:
         return Letter(f"cos({self.visit(node.node)})")
     return Number(cos(self.visit(node.node).value))
 def visit_minus_node(self, node):
     if type(self.visit(node.node).value) == str:
         return Letter(f"-{self.visit(node.node)}")
     return Number(-self.visit(node.node).value)
 def visit_number_node(node):
     return Number(node.value)