public override bool Try(TextBuffer output, BindingEnvironment e, Continuation k, MethodCallFrame predecessor) { if (!e.TryCopyGround(Value.Eval(e), out var expValue)) { // You can't set a variable to a non-ground value throw new ArgumentInstantiationException("set", e, new[] { (object)GlobalVariable, Value }); } if (LocalVariable == null) { return(Continue(output, new BindingEnvironment(e, e.Unifications, e.State.Bind(GlobalVariable, expValue)), k, predecessor)); } if (e.Unify(LocalVariable, expValue, out var result)) { return(Continue(output, new BindingEnvironment(e, result, e.State), k, predecessor)); } return(false); }
public override bool Try(TextBuffer output, BindingEnvironment e, Continuation k, MethodCallFrame predecessor) { if (!e.TryCopyGround(e.Resolve(element), out var elt)) { throw new ArgumentInstantiationException("add", e, new[] { "add", collectionVariable, elt }); } var collectionValue = e.Resolve(collectionVariable); switch (collectionValue) { case Cons list: return(Continue(output, new BindingEnvironment(e, e.Unifications, e.State.Bind(collectionVariable, new Cons(elt, list))), k, predecessor)); case IImmutableSet <object> set: return(Continue(output, new BindingEnvironment(e, e.Unifications, e.State.Bind(collectionVariable, set.Add(elt))), k, predecessor)); case ImmutableStack <object> stack: return(Continue(output, new BindingEnvironment(e, e.Unifications, e.State.Bind(collectionVariable, stack.Push(elt))), k, predecessor)); case ImmutableQueue <object> queue: return(Continue(output, new BindingEnvironment(e, e.Unifications, e.State.Bind(collectionVariable, queue.Enqueue(elt))), k, predecessor)); default: throw new ArgumentTypeException("add", typeof(Cons), collectionValue, new[] { "add", elt, collectionValue }); } }