/// <summary> /// Default function /// </summary> /// <para> /// Swaps the elements at index a and b in a list /// </para> /// <param name="list_expr"> the target <see cref="DynamicList"/> (as an <see cref="Expression"/>)</param> /// <param name="a_expr"> index of the first element</param> /// <param name="b_expr"> index of the second element</param> /// <returns> <see cref="NullVar"/> (equivalent of null/void)</returns> private static NullVar swapFunction(Expression list_expr, Expression a_expr, Expression b_expr) { // evaluate every expression DynamicList list = list_expr.evaluate() as DynamicList; Integer a = a_expr.evaluate() as Integer; Integer b = b_expr.evaluate() as Integer; // check indexes list.validateIndex(a); list.validateIndex(b); // extract both values Variable var_a = list.atIndex(a); Variable var_b = list.atIndex(b); // freeze the context Context.freeze(); // change a list.removeValue(a); list.insertValue(var_b, a); // change b list.removeValue(b); list.insertValue(var_a, b); // unfreeze the context Context.unfreeze(); // update manually (void) if (list.isTraced()) { list.tracer.update(new Event( new Alteration("swap", list, list.getRawValue(), new dynamic[] { a.getRawValue(), b.getRawValue() }))); } return(new NullVar()); }
/// <summary> /// Default function /// </summary> /// <para> /// Creates a copy of a <see cref="DynamicList"/> /// </para> /// <param name="list_expr"> the target <see cref="DynamicList"/></param> /// <returns> A new <see cref="DynamicList"/>. It's values are the same as the target list</returns> private static Variable copyListFunction(Expression list_expr) { // evaluate every expression Variable var_ = list_expr.evaluate(); Debugging.assert(var_ is DynamicList); // TypeError DynamicList list = var_ as DynamicList; // copy list var raw = new List <dynamic>(list.getRawValue()); return(Variable.fromRawValue(raw)); }