|
@@ -2,6 +2,7 @@ include "modelling.alh"
|
|
|
include "primitives.alh"
|
|
|
include "object_operations.alh"
|
|
|
include "model_management.alh"
|
|
|
+include "random.alh"
|
|
|
|
|
|
String function JSON_print(model : Element):
|
|
|
String result
|
|
@@ -134,3 +135,94 @@ Element function alphabet():
|
|
|
list_append(chars, "y")
|
|
|
list_append(chars, "z")
|
|
|
return chars!
|
|
|
+
|
|
|
+String function spawn_TODO(function : Element, arguments : Element):
|
|
|
+ // Define a new task, with all the required stack information
|
|
|
+ // This is taken from the "task_management" code
|
|
|
+ Element task_root
|
|
|
+ Element task_frame
|
|
|
+ Element output_value
|
|
|
+ Element input_value
|
|
|
+
|
|
|
+ task_root = create_node()
|
|
|
+ task_frame = create_node()
|
|
|
+ output_value = create_node()
|
|
|
+ input_value = create_node()
|
|
|
+ dict_add_fast(task_root, "frame", task_frame)
|
|
|
+ dict_add_fast(task_root, "globals", create_node())
|
|
|
+ dict_add_fast(task_root, "output", output_value)
|
|
|
+ dict_add_fast(task_root, "last_output", output_value)
|
|
|
+ dict_add_fast(task_root, "input", input_value)
|
|
|
+ dict_add_fast(task_root, "last_input", input_value)
|
|
|
+ dict_add_fast(task_frame, "evalstack", create_node())
|
|
|
+ dict_add_fast(task_frame, "returnvalue", create_node())
|
|
|
+ dict_add_fast(task_frame, "phase", "init")
|
|
|
+ dict_add_fast(task_frame, "IP", dict_read(dict_read(read_root(), "__hierarchy"), "__IP"))
|
|
|
+ dict_add_fast(task_frame, "symbols", create_node())
|
|
|
+
|
|
|
+ log("Setting IP to " + cast_value(function["body"]))
|
|
|
+ log("Has outputs: " + set_to_string(dict_keys(function)))
|
|
|
+
|
|
|
+ if (dict_in(function, "params")):
|
|
|
+ // And add the arguments to the symbol table
|
|
|
+ Element symbols
|
|
|
+ String arg_names_call
|
|
|
+ Element param_dict
|
|
|
+ Integer arg_i
|
|
|
+
|
|
|
+ symbols = task_frame["symbols"]
|
|
|
+ arg_names_call = "abcdefghijklmnopqrstuvwxyz"
|
|
|
+ arg_i = 0
|
|
|
+ param_dict = function["params"]
|
|
|
+
|
|
|
+ arguments = list_copy(arguments)
|
|
|
+ Element t
|
|
|
+ while (list_len(arguments) > 0):
|
|
|
+ t = create_edge(symbols, list_pop(arguments, 0))
|
|
|
+ create_edge(t, param_dict[arg_names_call[arg_i]])
|
|
|
+ arg_i = arg_i + 1
|
|
|
+
|
|
|
+ // Add this only at the end, as otherwise the task will already be detected and executed
|
|
|
+ String taskname
|
|
|
+ taskname = random_string(30)
|
|
|
+ while (dict_in(read_root(), taskname)):
|
|
|
+ taskname = random_string(30)
|
|
|
+ dict_add_fast(read_root(), taskname, task_root)
|
|
|
+
|
|
|
+ return taskname!
|
|
|
+
|
|
|
+String function spawn(function : Element, arguments : Element):
|
|
|
+ // Define a new task, with all the required stack information
|
|
|
+ // This is taken from the "task_management" code
|
|
|
+ Element task_root
|
|
|
+ Element task_frame
|
|
|
+ Element output_value
|
|
|
+ Element input_value
|
|
|
+
|
|
|
+ task_root = create_node()
|
|
|
+ task_frame = create_node()
|
|
|
+ output_value = create_node()
|
|
|
+ input_value = create_node()
|
|
|
+ dict_add_fast(task_root, "frame", task_frame)
|
|
|
+ dict_add_fast(task_root, "globals", create_node())
|
|
|
+ dict_add_fast(task_root, "output", output_value)
|
|
|
+ dict_add_fast(task_root, "last_output", output_value)
|
|
|
+ dict_add_fast(task_root, "input", input_value)
|
|
|
+ dict_add_fast(task_root, "last_input", input_value)
|
|
|
+ dict_add_fast(task_frame, "evalstack", create_node())
|
|
|
+ dict_add_fast(task_frame, "returnvalue", create_node())
|
|
|
+ dict_add_fast(task_frame, "phase", "init")
|
|
|
+ dict_add_fast(task_frame, "IP", dict_read(dict_read(read_root(), "__hierarchy"), "__IP"))
|
|
|
+ dict_add_fast(task_frame, "symbols", create_node())
|
|
|
+
|
|
|
+ dict_add_fast(task_root["globals"], "initial_function", function)
|
|
|
+ dict_add_fast(task_root["globals"], "initial_arguments", arguments)
|
|
|
+
|
|
|
+ // Add this only at the end, as otherwise the task will already be detected and executed
|
|
|
+ String taskname
|
|
|
+ taskname = random_string(30)
|
|
|
+ while (dict_in(read_root(), taskname)):
|
|
|
+ taskname = random_string(30)
|
|
|
+ dict_add_fast(read_root(), taskname, task_root)
|
|
|
+
|
|
|
+ return taskname!
|