Ejemplo n.º 1
0
        public IToken Apply(IToken arg)
        {
            if (Protocol == null)
            {
                return(new InteractOperator(arg));
            }

            if (State == null)
            {
                return(new InteractOperator(Protocol, arg));
            }

            var Vector = AlienMessageParser.Reduce(arg);

            var p1 = AlienMessageParser.Reduce(Protocol.Apply(State));
            var p2 = AlienMessageParser.Reduce(p1.Apply(Vector));

            var flag     = p2.Car().AsValue();
            var newState = IToken.Dem(p2.Cdr().Car().Mod());
            var data     = p2.Cdr().Cdr().Car();

            if (flag != 0)
            {
                var s = new SendOperator();
                var v = s.Apply(data);
                return(new InteractOperator(Protocol, newState).Apply(v));
            }

            AlienMessageParser.lastInteractResult = data;

            Debug.Assert(p2.Cdr().Cdr().Cdr() is NilOperator);

            return(new InteractOperator(Protocol, newState));
        }