示例#1
0
文件: MmRun.cs 项目: nerai/Nibbler
        private MacroTransition GetMacro()
        {
            if (Tape.IsMisaligned)
            {
                return(null);
            }

            var read = Tape.ReadPacked();
            var mt   = ML.GetMacro(Q, read, Tape.FacingRight);

            if (mt == null)
            {
                mt = MacroTransition.CreateSingleMacroTransition(Definition, Q, read, Tape.FacingRight, Tape.Macro);
                if (mt != null)
                {
                    ML.LearnMacro(mt);
                }
            }

            return(mt);
        }
示例#2
0
文件: MmRun.cs 项目: nerai/Nibbler
        private bool MacroTransitionStep(MacroTransition t)
        {
            if (t == null)
            {
                throw new ArgumentNullException();
            }

            if (t.Next == null)
            {
                Result.SetNonhalting("Single cell runs indefinitely: " + t.ToString(Definition));
                return(false);
            }

            if (TmPrintOptions.PrintTransitionLevel >= PrintTransitionLevel.All)
            {
                Log.ForegroundColor = ConsoleColor.Yellow;
                Log.Write(t.ToString(Definition));
            }

            try {
                if (t.EndFacingRight == null)
                {
                    // transition to halting state
                    Tape.WriteSingleInCell(t.Write, t.Direction, t.Shifts);
                }
                else
                {
                    bool dir;
                    bool whole;

                    if (true &&
                        Options.UseMacroForwarding &&
                        t.Source == t.Next &&
                        t.StartFacingRight == t.EndFacingRight
                        )
                    {
                        if (TmPrintOptions.PrintTransitionLevel >= PrintTransitionLevel.All)
                        {
                            var reps = Tape.GetEqualSymbolRepetitionCount();
                            Log.Write("x" + reps.ToString());
                        }
                        dir   = t.StartFacingRight;
                        whole = true;
                    }
                    else
                    {
                        dir   = t.Direction > 0;
                        whole = false;
                    }
                    if (!Tape.WritePacked(t.Write, dir, t.Shifts, whole))
                    {
                        Result.SetRefusedCandidate("A cell with a virtual exponent without direct value was accessed. This operation is invalid, as it may depend on the virtual's value. (LONELY_EXPONENT_EXCEPTION)");
                        return(false);
                    }
                }
            }
            finally {
                if (TmPrintOptions.PrintTransitionLevel >= PrintTransitionLevel.All)
                {
                    Log.WriteLine();
                    Log.ResetColor();
                }
            }

            Q = t.Next;
            return(true);
        }