def eval(self, st):
        funcdecnode = st.get_identifier(self.value)
        func_arguments = funcdecnode.children[0]
        local_variables = funcdecnode.children[1].children[0]
        local_functions = funcdecnode.children[1].children[1]
        local_statements = funcdecnode.children[1].children[2]

        local_st = SymbolTable(st)

        func_arguments.eval(local_st)

        name_args = [arg.value for arg in func_arguments.children]
        value_args = [(arg[0].eval(local_st), arg[1])
                      for arg in self.children[0]]
        new_value_args = []

        for arg in value_args:
            if isinstance(arg[0], int):
                if isinstance(arg[0], bool):
                    new_value_args.append([arg[0], "BOOLEAN"])
                else:
                    new_value_args.append([arg[0], "INTEGER"])

        if not len(func_arguments.children) == len(new_value_args) + 1:
            raise ValueError(
                f"wrong number of parameters specified for call to {self.value}"
            )

        i = 0
        while i < len(new_value_args):
            if local_st.get_identifier(name_args[i],
                                       what=0) != new_value_args[i][1]:
                raise ValueError(
                    f"Incompatible type for arg no. {i+1} in call to {self.value}"
                )

            local_st.set_identifier(name_args[i], new_value_args[i][0])

            i += 1

        local_variables.eval(local_st)
        local_functions.eval(local_st)
        local_statements.eval(local_st)

        ret = local_st.get_identifier(self.value)

        return ret