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
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)
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))
def evaluate(self): return language.Atomic.create(float(self.value), types.DoubleType())
def evaluate(self): return language.Atomic.create(None, types.DoubleType(), is_inf=True)
# 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())