def Subtract(left, right): left_arg_type, left_type, left_value = link.unpack(left) right_arg_type, right_type, right_value = link.unpack(right) if left_type == "number" and right_type == "number": value = left_value - right_value num = append.data_segment("number", value) append.memory_stack("link", num) else: raise UndefinedBehaviour(f"Для типов {left_type} и {right_type} " f"операция вычитания Sub не определена")
def Multiply(left, right): left_arg_type, left_type, left_value = link.unpack(left) right_arg_type, right_type, right_value = link.unpack(right) if left_type == "number" and right_type == "number": value = left_value * right_value num = append.data_segment("number", value) append.memory_stack("link", num) else: raise UndefinedBehaviour(f"Для типов {left_type} и {right_type} " f"операция умножения Mul не определена")
def Equal(left, right): left_arg_type, left_type, left_value = link.unpack(left) right_arg_type, right_type, right_value = link.unpack(right) if left_type == "number" and right_type == "number": value = left_value == right_value num = append.data_segment("logic", value) append.memory_stack("link", num) else: raise UndefinedBehaviour(f"Для типов {left_type} и {right_type} " f"операция сравнения Eql не определена")
def Xor(left, right): left_arg_type, left_type, left_value = link.unpack(left) right_arg_type, right_type, right_value = link.unpack(right) if left_type == "logic" and right_type == "logic": value = left_value + right_value == 1 num = append.data_segment("logic", value) append.memory_stack("link", num) else: raise UndefinedBehaviour(f"Для типов {left_type} и {right_type} " f"операция логического ЛИБО XOR не определена")
def Divide(left, right): left_arg_type, left_type, left_value = link.unpack(left) right_arg_type, right_type, right_value = link.unpack(right) if left_type == "number" and right_type == "number": if right_value == 0: raise UndefinedBehaviour("Результат деления на ноль не определён") value = int(left_value / right_value) num = append.data_segment("number", value) append.memory_stack("link", num) else: raise UndefinedBehaviour(f"Для типов {left_type} и {right_type} " f"операция деления Div не определена")
def Modulo(left, right): left_arg_type, left_type, left_value = link.unpack(left) right_arg_type, right_type, right_value = link.unpack(right) if left_type == "number" and right_type == "number": if right_value == 0: raise UndefinedBehaviour("Результат остатка деления на ноль не " "определён") value = left_value % right_value num = append.data_segment("number", value) append.memory_stack("link", num) else: raise UndefinedBehaviour( f"Для типов {left_type} и {right_type} операция остаток от деления " f"Mod не определена")
def Negative(arg): arg_type, obj_type, value = link.unpack(arg) if obj_type == "number": value = -value num = append.data_segment("number", value) append.memory_stack("link", num) else: raise UndefinedBehaviour(f"Для типа {obj_type} не определена операция " f"инверсии Neg")
def Increment(arg): arg_type, obj_type, value = link.unpack(arg) if obj_type == "number": value += 1 num = append.data_segment("number", value) append.memory_stack("link", num) else: raise UndefinedBehaviour(f"Для типа {obj_type} не определена операция " f"инкремента Inc")
def Not(arg): arg_type, obj_type, value = link.unpack(arg) if obj_type == "logic": value = not value num = append.data_segment("logic", value) append.memory_stack("link", num) else: raise UndefinedBehaviour(f"Для типа {obj_type} не определена операция " f"логического НЕ Not")
def Jump_if(condition, arg): cond_arg_type, cond_type, cond_value = link.unpack(condition) arg_type, arg_value = arg if arg_type == "link": if cond_type == "logic": if not cond_value: change.attribute(seg_links["system"], "target_cell", arg_value) append.memory_stack("link", 0) else: raise UndefinedBehaviour( f"Поведение команды Jif с аргументами типов {arg_type} и " f"{cond_type} не определено") else: raise UndefinedArgument(f"Поведение команды Jif с аргументом типа" f"{arg_type} не определено")
def Sub_object(parent, index): par_type, par_value = parent ind_arg_type, ind_type, ind_value = link.unpack(index) if ind_type == "link": ind_type, ind_value = link.get_link(ind_value) if ind_type != "number": raise UndefinedBehaviour(f"Получение элемента командой Sob с индексом" f"типа {ind_type} не определено") if ind_value < 0: raise UndefinedBehaviour(f"Получение элемента командой Sob с " f"отрицательным индексом не определено") if ind_value == 0: raise UndefinedBehaviour(f"Получение элемента командой Sob с " f"нулевым индексом не определено") if par_type == "link": kind, link_value = read.entity(par_value) if kind == "link": kind = find.kind(link_value) par_value = link_value if kind == "string_segment": elem_type, elem_value = get.string_segment_element( par_value, ind_value) elif kind == "list_segment": elem_type, elem_value = get.list_segment_element( par_value, ind_value) else: raise UndefinedBehaviour(f"Получение элемента командой Sob для " f"типа {kind} не определено") if elem_type == "none": num = append.data_segment("none", 0) append.memory_stack("link", num) elif elem_type == "link": append.memory_stack("link", elem_value) else: raise LowerCommandError(f"Поиск элемента не может возращать объект" f"типа {elem_type}") else: raise UndefinedArgument(f"Поведение команды Sob с аргументом типа" f"{par_type} не определено")