Пример #1
0
        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);
        }
Пример #2
0
        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 });
            }
        }