def _interpret(interpreter: Interpreter, actual_params: tp.List[ast.AST]) -> d.Number:
        evaluated_params = []
        for idx, param in enumerate(actual_params):
            param_value = interpreter.visit(param)
            param_type = type(param_value)

            if not issubclass(param_type, d.Number):
                raise err.ArgumentTypeError(
                    idx=idx,
                    expected=d.Number,
                    given=param_value
                )

            if param_value == d.Integer(0):
                if idx > 0 or (idx == 0 and len(actual_params) == 1):
                    raise err.BuiltinProcError(
                        error_code=err.ErrorCode.DIVISION_BY_ZERO,
                        token=None
                    )

            evaluated_params.append(param_value)

        if len(actual_params) == 1:
            result = d.Integer(1)/evaluated_params[0]
        else:
            result = evaluated_params[0]
            for param_value in evaluated_params[1:]:
                result /= param_value

        return result
示例#2
0
 def visit_Rat(self, node: ast.Rat) -> Union[d.Integer, d.RationalNum]:
     numerator = node.value[0]
     denominator = node.value[1]
     fraction = f.Fraction(numerator, denominator)
     if fraction.denominator == 1:
         return d.Integer(fraction.numerator)
     else:
         return d.RationalNum(fraction.numerator, fraction.denominator)
    def _interpret(interpreter: Interpreter, actual_params: tp.List[ast.AST]) -> d.Integer:
        param_value = interpreter.visit(actual_params[0])
        param_type = type(param_value)

        if not issubclass(param_type, d.RealNum):
            raise err.ArgumentTypeError(
                expected=d.RealNum,
                given=param_value
            )

        if param_value > d.Integer(0):
            result = d.Integer(1)
        elif param_value < d.Integer(0):
            result = d.Integer(-1)
        else:
            result = d.Integer(0)

        return result
示例#4
0
    def _interpret(interpreter: Interpreter,
                   actual_params: tp.List[ast.AST]) -> d.Boolean:
        string = param_value = interpreter.visit(actual_params[0])
        param_type = type(param_value)

        if not issubclass(param_type, d.String):
            raise err.ArgumentTypeError(expected=d.String, given=param_value)

        index = param_value = interpreter.visit(actual_params[1])
        param_type = type(param_value)

        if not issubclass(param_type, d.Integer) or index < d.Integer(0):
            message = f'string-ith: expected a natural number for the second argument, but received {index}'
            raise err.CustomBuiltinProcError(message=message)

        if index >= d.Integer(len(string)):
            message = f'string-ith: expected an exact integer [0, {len(string)}) '
            message += f'(i.e., less than the length of the given string) for the second argument, but received {index}'
            raise err.CustomBuiltinProcError(message=message)

        return string[index]
    def _interpret(interpreter: Interpreter, actual_params: tp.List[ast.AST]) -> d.Boolean:
        param_value = interpreter.visit(actual_params[0])
        param_type = type(param_value)

        if not issubclass(param_type, d.Number):
            raise err.ArgumentTypeError(
                expected=d.Number,
                given=param_value
            )

        result = d.Boolean(param_value == d.Integer(0))
        return result
示例#6
0
    def _interpret(interpreter: Interpreter,
                   actual_params: tp.List[ast.AST]) -> d.List:
        count = param_value = interpreter.visit(actual_params[0])
        param_type = type(param_value)

        if not issubclass(param_type, d.Integer) or param_value < d.Integer(0):
            raise err.ArgumentTypeError(expected=d.NaturalNum,
                                        given=param_value)

        data = interpreter.visit(actual_params[1])

        result = d.List(int(count) * [data])
        return result
    def _interpret(interpreter: Interpreter, actual_params: tp.List[ast.AST]) -> d.Number:
        evaluated_params = []
        for idx, param in enumerate(actual_params):
            param_value = interpreter.visit(param)
            param_type = type(param_value)

            if not issubclass(param_type, d.Number):
                raise err.ArgumentTypeError(
                    idx=idx,
                    expected=d.Number,
                    given=param_value
                )

            evaluated_params.append(param_value)

        result = d.Integer(1)
        for param_value in evaluated_params:
            if param_value == d.Integer(0):
                result = d.Integer(0)
                break

            result *= param_value

        return result
    def _interpret(interpreter: Interpreter, actual_params: tp.List[ast.AST]) -> d.Number:
        param_value = interpreter.visit(actual_params[0])
        param_type = type(param_value)

        if not issubclass(param_type, d.Number):
            raise err.ArgumentTypeError(
                expected=d.Number,
                given=param_value
            )

        if param_value < d.Integer(0):
            raise NotImplementedError('Complex numbers not supported yet.')

        number = math.sqrt(param_value.value)
        result = d.InexactNum(number)

        return result
    def _interpret(interpreter: Interpreter, actual_params: tp.List[ast.AST]) -> d.Integer:
        evaluated_params = []
        for idx, param in enumerate(actual_params):
            param_value = interpreter.visit(param)
            param_type = type(param_value)

            if not issubclass(param_type, d.Integer):
                raise err.ArgumentTypeError(
                    idx=idx,
                    expected=d.Integer,
                    given=param_value
                )

            evaluated_params.append(param_value)

        number = int(evaluated_params[0])
        modulus = int(evaluated_params[1])
        remainder = number % modulus
        result = d.Integer(remainder)

        return result
示例#10
0
    def _interpret(interpreter: Interpreter, actual_params: tp.List[ast.AST]) -> d.Integer:
        evaluated_params = []
        for idx, param in enumerate(actual_params):
            param_value = interpreter.visit(param)
            param_type = type(param_value)

            if not issubclass(param_type, d.Integer):
                raise err.ArgumentTypeError(
                    idx=idx,
                    expected=d.Integer,
                    given=param_value
                )

            evaluated_params.append(param_value)

        lcm = 1

        for param_value in evaluated_params:
            lcm = abs(lcm * int(param_value)) // math.gcd(lcm, int(param_value))

        result = d.Integer(lcm)

        return result
示例#11
0
 def _interpret(interpreter: Interpreter, actual_params: tp.List[ast.AST]) -> d.Number:
     result = d.Integer(math.floor(time.time()))
     return result
示例#12
0
 def visit_Int(self, node: ast.Int) -> d.Integer:
     return d.Integer(node.value)