public Field Invoke(Runner runner, Node node) { try { runner.PushContext(); for (int i = 0, l = Math.Min(arguments.Count, node.Count); i < l; i++) { runner.SetField( runner.Eval(arguments[i]).StringValue, runner.Eval(node[i])); } return(runner.Eval(body)); } finally { runner.PopContext(); } }
public static Field SetValue(Runner runner, Node block) { if (block.Count < 2) { throw new ArgumentException(); } var tag = Convert.ToString(block[0]); if (block.Count == 2) { return(runner.SetField(tag, runner.Eval(block[1]))); } Field field = runner.GetFieldOrInit(tag, FieldType.Object); for (int i = 1, l = block.Count - 2; i < l; i++) { field = field.GetAndEnsureType(runner.Eval(block[i]), FieldType.Object); } return(field[runner.Eval(block[block.Count - 2])] = runner.Eval(block[block.Count - 1])); }