Example #1
0
    def compute(self, env: Environment):
        ln: VectorObj = env.find_object('length')
        if ln.get_type().name not in ['double', 'integer']:
            raise errors.InvalidArg('length')

        if len(ln.items) != 1:
            raise errors.InvalidArg('length')

        val = ln.items[0][1]

        if val.is_inf:
            raise errors.R_RuntimeError('vector size cannot be infinite')
        elif val.is_na:
            raise errors.InvalidArg('length')
        elif val.is_nan:
            raise errors.R_RuntimeError('vector size cannot be NA/NaN')

        count = val.value

        items = [
            VectorItem(None, Atomic(0, types.DoubleType()))
            for _ in range(int(count) * (-1 if val.is_neg else 1))
        ]

        ret = VectorObj(items, types.DoubleType())
        return ret
Example #2
0
def get_more_important_vector_type(type1, type2):
    tps = [type1.name, type2.name]
    # if 'list' in tps:
    #     return types.ListType()
    if 'character' in tps:
        return types.CharacterType()
    elif 'double' in tps:
        return types.DoubleType()
    elif 'integer' in tps:
        return types.IntegerType()
    elif 'logical' in tps:
        return types.LogicalType()
    first = tps[0] not in ['character', 'double', 'integer', 'logical']
    raise UnsupportedVectorType(tps, operand_index=0 if first else 1)
Example #3
0
def cast_atomic(e: Atomic, type_name):
    if e.get_type().name == type_name:
        return e
    elif type_name == 'character':
        ret = Atomic(bool(e.value), types.CharacterType(), is_na=e.is_na, is_nan=e.is_nan, is_inf=e.is_inf,
                     is_neg=e.is_neg)
        return ret
    elif type_name == 'double':
        ret = Atomic(float(e.value), types.DoubleType(), is_na=e.is_na, is_nan=e.is_nan, is_inf=e.is_inf,
                     is_neg=e.is_neg)
        return ret
    elif type_name == 'integer':
        ret = Atomic(int(e.value), types.IntegerType(), is_na=e.is_na, is_nan=e.is_nan, is_inf=e.is_inf,
                     is_neg=e.is_neg)
        return ret
    elif type_name == 'logical':
        ret = Atomic(bool(e.value), types.LogicalType(), is_na=e.is_na, is_nan=e.is_nan, is_inf=e.is_inf,
                     is_neg=e.is_neg)
        return ret
    else:
        raise Exception('unsupported vector cast type - {}'.format(type_name))
Example #4
0
 def evaluate(self):
     return language.Atomic.create(float(self.value), types.DoubleType())
Example #5
0
 def evaluate(self):
     return language.Atomic.create(None, types.DoubleType(), is_inf=True)
Example #6
0
#
r1 = language.PowerObj.create(res, res2).evaluate(this_env)

res3 = CallObj(objs.SymbolObj('^'), [res, res2]).evaluate(this_env)

print('r1')
print(r1.show_self())
print(res2.show_self())
print(res3.show_self())

print(res3.show_self())

symbol_c = objs.SymbolObj('c')

vec_2 = Atomic.create(5, types.IntegerType(), is_neg=True)  ## 2L
vec_3 = Atomic.create(0, types.DoubleType(), is_neg=True)  ## 3

vec_4 = CallObj(symbol_c, [vec_2, vec_3, vec_2, vec_3]).evaluate(this_env)

r = CallObj(
    objs.SymbolObj('/'),
    [vec_2, vec_4],
).evaluate(this_env)

# 2 / 3

print(vec_2.show_self())
print(vec_4.show_self())
print('res')
print(r.show_self())