diff --git a/main.py b/main.py index 1d08120..3b3509c 100755 --- a/main.py +++ b/main.py @@ -4,33 +4,35 @@ import parse -def do_text_append(subject, args): - return { - "type": "text", - "value": subject["value"] + " " + args[0]["value"], - "verb_Append": do_text_append, - } - -def make_text(value): - return { - "type": "text", - "value": value, - "verb_Append": do_text_append, - } - -def do_system_print(subject, args): - print(args[0]["value"]) +def text_create(value): + return ("text", value) +def text_value(object): + return object[1] +def text_dispatch(object, verb, args): + value = text_value(object) + if verb == "Append": + appendix = text_value(args[0]) + return text_create(value + " " + appendix) return None +def module_create(verbs): + return ("module", verbs) +def module_dispatch(object, verb, args): + (type, functions) = object + return functions[verb](object, args) + +def do_system_print(subject, args): + print(text_value(args[0])) + return None def do_system_read(subject, args): - return make_text(input()) + return text_create(input()) +system_module = module_create({ + "Print": do_system_print, + "Read": do_system_read, +}) base_env = { - "System": { - "type": "module", - "verb_Print": do_system_print, - "verb_Read": do_system_read, - } + "System": system_module, } def resolve_value(env, value): @@ -38,17 +40,20 @@ if type == "reference": return env[value] elif type == "text": - return make_text(value) + return text_create(value) else: print("Unimplemented value type: %s" % (type)) def run_statement(env, ast): subject = resolve_value(env, ast[1]) - command = subject["verb_" + ast[2]] args = [] for arg in ast[3]: args.append(resolve_value(env, arg)) - return command(subject, args) + if subject[0] == "text": + return text_dispatch(subject, ast[2], args) + elif subject[0] == "module": + return module_dispatch(subject, ast[2], args) + return None def run_set(env, ast): env[ast[1]] = run_statement(env, ast[2])