def unpack(arg): arg_type, arg_value = arg if arg_type != "link": raise UndefinedArgument(f"Нельзя распаковать не-ссылку {arg_type}") obj_type, value = get_link(arg_value) if obj_type == "link": obj_type, value = get.entity(value) return arg_type, obj_type, value
def Output(arg): arg_type, arg_value = arg if arg_type == "link": value_type, value = get.entity(arg_value) if value_type == "link": arg_value = value value_type, value = get.entity(value) if constants.mode == "console": draw.entity(arg_value) elif constants.mode == "editor": if value_type == "none": value = "none" constants.output_data = constants.output_data + [to_string.entity(arg_value)] append.memory_stack("link", 0) else: raise UndefinedBehaviour(f"Поведение команды Out с аргументом типа" f"{arg_type} не определено")
def list_segment(value): result = [] for link in value: obj_type, obj_value = get.entity(link) if obj_type == "list_segment": obj_value = list_segment(obj_value) result += [str(obj_value)] return f"[{', '.join(result)}]"
def entity(num): kind, value = get.entity(num) if kind in seg_types: if kind in seg_visible_types: print(value) else: raise LowerCommandError(f"Неотображаемый тип сегмента {kind}") else: return display.entity(num)
def Find(arg): arg_type, arg_value = arg if arg_type == "link": key = get.entity(arg_value) # потом: сделать механизм восходящего поиска seg_num = find.attribute(seg_links["system"], "target_namespace") res_type, res_num = get.namespace_element(seg_num, key) append.memory_stack("link", res_num) else: raise UndefinedArgument(f"Поведение команды Fnd с аргументом типа " f"{arg_type} не определено")
def Length(arg): arg_type, arg_value = arg if arg_type == "link": kind = find.kind(arg_value) if kind == "link": kind, arg_value = get.entity(arg_value) kind = find.kind(arg_value) if kind == "string_segment": length = get.string_segment_length(arg_value) elif kind == "list_segment": length = get.list_segment_length(arg_value) else: raise UndefinedBehaviour(f"Получение длины командой Len для " f"типа {kind} не определено") num = append.data_segment("number", length) append.memory_stack("link", num) else: raise UndefinedArgument(f"Поведение команды Len с аргументом типа " f"{arg_type} не определено")
def get_dictionary_item(num): key_type, key_link = find.dictionary_item_key(num) value_type, value_link = find.dictionary_item_value(num) key = get.entity(key_link) value = get.entity(value_link) return key, value
def get_link(link): return get.entity(link)
def entity(link): value_type, value = get.entity(link) if value_type == "list_segment": return list_segment(value) else: return str(value)