parent $libraries
parent $has_messages
object $root_evaluator
var $root dbref 'root_evaluator
var $root child_index 2
var $root fertile 1
var $root manager $root_evaluator
var $root owned [$root_evaluator]
var $root owners [$]
var $root writable []
var $root readable ['parameters, 'methods, 'code]
var $root inited 1
var $root_evaluator append_str "_stmt"
method eval_ctext
arg vars, term;
var vars;
// message is the message to be evaluated.
// times is a list of the symbols that should be processed.
// times = [] processes all symbols.
if (type(term) != 'list)
throw(~type, "Term must be a list. Was " + ($data.unparse(term)));
if ('time in dict_keys(vars)) {
if (type(vars['time]) != 'symbol)
throw(~type, "Time must be a symbol.");
} else {
vars = dict_add(vars, 'time, 'pre);
}
vars = dict_add(vars, 'force, 1);
vars = dict_add(vars, 'delay, 0);
vars = dict_add(vars, 'debug, 0);
vars = ._eval_ctext(vars, term);
if ('process in dict_keys(vars))
return vars;
else
return $ctext_class.new(vars['result]);
.
method apply
arg vars, list, method, [args];
var l, output;
// call method once for each element in list.
// the element is passed as the first argument.
output = [];
if (args) {
for l in (list) {
vars = .(method)(vars, [l, @args]);
output = [@output, vars['result]];
}
} else {
for l in (list) {
vars = .(method)(vars, l);
output = [@output, vars['result]];
}
}
if (listlen(output) > 1)
return dict_add(vars, 'result, ['list_type, output]);
else if (listlen(output) == 1)
return dict_add(vars, 'result, output[1]);
else
return dict_add(vars, 'result, ['list_type, []]);
.
method list_type
arg vars, term;
var t, output, output2;
output = [];
for t in (term) {
if (type(t[1]) == 'list)
t = t[1];
vars = ._eval_ctext(vars, t);
output = [@output, vars['result]];
}
return dict_add(vars, 'result, ['list_type, output]);
.
method parse_command
arg text;
var output, ret_val, term, word, final, first_term, final_args, token;
output = [];
term = [];
word = "";
while (text) {
ret_val = text.split_on_next(["\"", "{", "%", "&", "[", " ", "}"]);
word = ret_val[1];
token = ret_val[2];
text = ret_val[3];
switch (token) {
case "{":
output = ._handle_word(output, term);
ret_val = .parse_command(text);
output = [@output, ret_val[1]];
text = ret_val[2];
case "[":
output = ._handle_word(output, term);
ret_val = .parse_list(text);
output = [@output, ret_val[1]];
text = ret_val[2];
case "%":
output = ._handle_word(output, term);
ret_val = .parse_varref(text);
output = [@output, ret_val[1]];
text = ret_val[2];
case "\"":
output = ._handle_word(output, term);
ret_val = .parse_string(text);
output = [@output, ret_val[1]];
text = ret_val[2];
case " ":
output = ._handle_word(output, word);
case "}":
output = ._handle_word(output, word);
if (type(output[1]) != 'list)
output = [output];
first_term = output[1];
if ((first_term[1]) == 'string_type) {
first_term = tosym((first_term[2]) + "_stmt");
final_args = [];
} else {
first_term = 'eval_stmt;
final_args = [first_term];
}
if (listlen(output) > 1)
final_args = [@(final_args + sublist(output, 2))];
return [[first_term, final_args], text];
}
}
.
method normalize
arg args;
var key, new;
//turns ctext style data into Coldc data
switch (args[1]) {
case 'dictionary_type:
new = #[];
for key in (dict_keys(args[2]))
new = dict_add(new, key, .normalize((args[2])[key]));
return new;
case 'list_type:
new = [];
for key in (args[2])
new = [@new, .normalize(key)];
return new;
default:
return args[2];
}
.
method fix_values
arg stuff;
var key, new;
switch (type(stuff)) {
case 'dictionary:
new = #[];
for key in (dict_keys(stuff))
new = dict_add(new, key, .fix_values(stuff[key]));
return new;
case 'list:
new = [];
for key in (stuff)
new = [@new, .fix_values(key)];
return ['list_type, new];
case 'symbol:
return ['symbol_type, stuff];
case 'string:
return ['string_type, stuff];
case 'integer:
return ['integer_type, stuff];
case 'dbref:
return ['dbref_type, stuff];
}
.
method _truth
arg value;
var result;
switch (value[1]) {
case 'symbol_type:
return 1;
case 'integer_type:
return value[2];
case 'string_type:
if (((value[2]) == "0") || ((value[2]) == ""))
return 0;
else
return 1;
case 'list_type:
return listlen(value[2]);
default:
return ">>ERROR: Argument to condtional not a value<<";
}
.
method parse_list
arg text;
var output, ret_val, term, word, token, int;
output = [];
term = [];
word = "";
while (text) {
ret_val = text.split_on_next(["[", "]", "(", "\"", "%", "&", " "]);
word = ret_val[1];
token = ret_val[2];
text = ret_val[3];
switch (token) {
case "(":
output = ._handle_word(output, word);
vars = .parse_command(text);
output = [@output, vars['result]];
text = vars['text];
case "[":
output = ._handle_word(output, word);
vars = .parse_list(text);
output = [@output, vars['result]];
text = vars['text];
case "%":
output = ._handle_word(output, word);
vars = .parse_varref(text);
output = [@output, vars['result]];
text = vars['result];
case "\"":
output = ._handle_word(output, word);
ret_val = .parse_string(text);
output = [@output, vars['result]];
text = vars['result];
case " ":
output = ._handle_word(output, word);
case "]":
output = ['list_type, ._handle_word(output, word)];
vars = dict_add(vars, 'text, text);
return dict_add(vars, 'result, output);
}
}
.
method parse_string
arg text;
var output, word, ret_val, is_text, token;
output = [];
word = "";
is_text = 0;
while (text) {
ret_val = text.split_on_next(["\"", "{", "%", "&"]);
word = ret_val[1];
token = ret_val[2];
text = ret_val[3];
switch (token) {
case "{":
output = ._handle_word(output, word);
ret_val = .parse_command(text);
output = [@output, ret_val[1]];
text = ret_val[2];
is_text = 1;
case "%":
output = ._handle_word(output, word);
ret_val = .parse_varref(text);
output = [@output, ret_val[1]];
text = ret_val[2];
is_text = 1;
case "&":
output = ._handle_word(output, word);
ret_val = .parse_charref(text);
output = [@output, ret_val[1]];
text = ret_val[2];
is_text = 1;
case "\"":
output = ._handle_word(output, word);
if (is_text)
output = ['text_stmt, output];
if (listlen(output) == 1)
output = output[1];
return [output, text];
}
}
return [output, text];
.
method parse_charref
arg text;
var pos;
pos = ";" in text;
return [['char_type, substr(text, 1, pos - 1)], substr(text, pos + 1)];
.
method parse_varref
arg text;
var output, ret_val, word, token;
output = [];
word = "";
while (text) {
ret_val = text.split_on_next(["{", "%", "&", ";"]);
word = ret_val[1];
token = ret_val[2];
text = ret_val[3];
switch (token) {
case "{":
output = ._handle_word(output, word);
ret_val = .parse_command(length, text);
output = [@output, @ret_val[1]];
text = ret_val[2];
case "%":
output = ._handle_word(output, word);
ret_val = .parse_varref(length, text);
output = [@output, @ret_val[1]];
text = ret_val[2];
case "&":
output = ._handle_word(output, word);
ret_val = .parse_charref(length, text);
output = [@output, @ret_val[1]];
text = ret_val[2];
case ";":
output = ._handle_word(output, word);
return [['get_stmt, output], text];
}
}
.