Exemplo n.º 1
0
def boolean_or(interpreter, values):
    if len(values) < 2:
        raise NotEnoughParametersException(
            'or requires at least two parameters')
    if values[0].type != Value.BOOLEAN:
        raise UnsupportedParameterType('parameters of or must be booleans')
    boolean = values[0].value
    for value in values[1:]:
        if not value.type == Value.BOOLEAN:
            raise UnsupportedParameterType('parameters of or must be booleans')
        boolean = boolean or value.value
    return Value(Value.BOOLEAN, boolean)
Exemplo n.º 2
0
def div(interpreter, values):
    if len(values) == 0:
        raise NotEnoughParametersException('/ requires at least one parameter')
    if values[0].type != Value.INTEGER:
        raise UnsupportedParameterType(
            '- operator: unsupported operand: {}'.format(values[0].value))
    div_sum = values[0].value
    for value in values[1:]:
        if not value.type == Value.INTEGER:
            raise UnsupportedParameterType(
                '/ operator: unsupported operand: {}'.format(value))
        div_sum //= value.value
    return Value(Value.INTEGER, div_sum)
Exemplo n.º 3
0
def _two_param_integer_func(values, name):
    if len(values) < 2:
        raise NotEnoughParametersException(
            '{} requires three parameters'.format(name))
    if len(values) > 2:
        raise TooManyParametersException(
            '{} requires three parameters'.format(name))
    if values[0].type != Value.INTEGER:
        raise UnsupportedParameterType(
            'first parameter of {} must be an integer'.format(name))
    if values[1].type != Value.INTEGER:
        raise UnsupportedParameterType(
            'second parameter of {} must be an integer'.format(name))
    return values[0].value, values[1].value
Exemplo n.º 4
0
def _single_param_list_func(values, name, min_length=False):
    if len(values) == 0:
        raise NotEnoughParametersException(
            '{} requires one parameter: <list>'.format(name))
    if len(values) > 1:
        raise TooManyParametersException(
            '{} requires one parameter: <list>'.format(name))
    l = values[0]
    if l.type != Value.LIST:
        raise UnsupportedParameterType(
            'parameter of {} must be a list'.format(name))
    if min_length and len(l.value) == 0:
        raise UnsupportedParameterType(
            '{}: list needs at least one element'.format(name))
    return l.value
Exemplo n.º 5
0
def minus(interpreter, values):
    if len(values) == 0:
        raise NotEnoughParametersException('- requires at least one parameter')
    if values[0].type != Value.INTEGER:
        raise UnsupportedParameterType(
            '- operator: unsupported operand: {}'.format(values[0].value))
    minus_sum = values[0].value
    if len(values) == 1:
        minus_sum = -minus_sum
    else:
        for value in values[1:]:
            if not value.type == Value.INTEGER:
                raise UnsupportedParameterType(
                    '- operator: unsupported operand: {}'.format(value))
            minus_sum -= value.value
    return Value(Value.INTEGER, minus_sum)
Exemplo n.º 6
0
def list_map(interpreter, values):
    if not len(values) == 2:
        raise NotEnoughParametersException(
            'map required two params: <function> <list>')
    func, list_value = values
    if func.type != Value.FUNCTION:
        raise UnsupportedParameterType(
            'First parameter of map must be a function')
    if list_value.type != Value.LIST:
        raise UnsupportedParameterType(
            'Second parameter of map must be a list')

    ret = []
    for value in list_value.value:
        ret.append(interpreter.function(func.value, [value], {}))

    return Value(Value.LIST, ret)
Exemplo n.º 7
0
def boolean_not(interpreter, values):
    if len(values) == 0:
        raise NotEnoughParametersException('not requires one parameter')
    if len(values) > 1:
        raise TooManyParametersException('not requires one parameter')
    boolean = values[0]
    if boolean.type != Value.BOOLEAN:
        raise UnsupportedParameterType('parameter of not must be a boolean')
    return Value(Value.BOOLEAN, not boolean.value)
Exemplo n.º 8
0
def plus(interpreter, values):
    if len(values) == 0:
        raise NotEnoughParametersException('+ requires at least one parameter')
    plus_sum = 0
    for value in values:
        if not value.type == Value.INTEGER:
            raise UnsupportedParameterType(
                '+ operator: unsupported operand: {}'.format(value))
        plus_sum += value.value
    return Value(Value.INTEGER, plus_sum)
Exemplo n.º 9
0
def not_equals(interpreter, values):
    if len(values) < 2:
        raise NotEnoughParametersException('== requires two parameters')
    if len(values) > 2:
        raise TooManyParametersException('== requires two parameters')
    value1, value2 = values
    if value1.type != value2.type:
        raise UnsupportedParameterType(
            'both parameters of == must be the same type')
    return value1.value != value2.value
Exemplo n.º 10
0
def if_builtin(interpreter, values):
    if len(values) < 3:
        raise NotEnoughParametersException('if requires three parameters')
    if len(values) > 3:
        raise TooManyParametersException('if requires three parameters')

    condition, true_value, false_value = values

    if condition.type != Value.BOOLEAN:
        raise UnsupportedParameterType(
            'first parameter of if must be a boolean')

    if condition.value:
        return true_value
    else:
        return false_value