Пример #1
0
        public override object Выполнить(План вызывающееДействие)
        {
            bool значениеУсловия;

            проверкаУсловия : значениеУсловия = (bool)УсловиеВыхода.Выполнить(this);

            if (значениеУсловия == true)
            {
                var команда = (string)ТелоЦикла.Выполнить(this);
                if (команда == "готово")
                {
                    goto проверкаУсловия;
                }
                if (команда == "продолжить")
                {
                    goto проверкаУсловия;
                }
                if (команда == "прервать")
                {
                    return("готово");                       //выход из цикла = break
                }
            }

            return("готово");
        }
Пример #2
0
        public override object Выполнить(План вызывающееДействие)
        {
            // найти определение функции в полученном окружении
            // здесь только
            var определениеФункции = (ОпределениеФункции)вызывающееДействие.ЗначениеПеременной(ИмяФункции);

            //создать контекст
            //СловарьВнутреннихПеременных = new Dictionary<string, object>();
            СоздатьСписокПеременных();

            // присвоить значение переданных параметров в текущий контекст
            foreach (var параметр in СписокИменованныхПараметров)
            {
                СловарьВнутреннихПеременных.Add(параметр.Key, параметр.Value); //значение параметра может быть действие = значение другой переменной или адрес этой переменной
                // ПолучитьЗначениеПеременной{переменая=Имя}результат будет либо адрес либо примитив, примитив надо полностью копировать
                //ПолучитьАдресПеременной(переменная=Имя), в функции появиться дубль внешней переменной , примитив тоже храниться по адресу в некоторой группе
            }
            // запустить список Действий, используется один список действий из определения, но с разным контекстом
            foreach (var действие in определениеФункции.ТелоФункции)
            {
                if (действие is ВернутьРезультат)
                {
                    езультат = действие.Выполнить(this);
                    break;
                }
                действие.Выполнить(this);
            }

            //вернуть результат

            return(езультат);
        }
Пример #3
0
        public override object Выполнить(План вызывающееДействие)
        {
            ВышестоящийПлан = вызывающееДействие;// для доступа к вышележащим переменным
            //СловарьВнутреннихПеременных = new Dictionary<string, object>();
            СоздатьСписокПеременных();


            foreach (var действие in СписокДействий) // так не возможны возвраты повторы действий, да и хер ними без goto
            {
                if (действие is Прервать)
                {
                    return("прервать");
                }
                if (действие is Продолжить)
                {
                    return("продолжить");
                }
                //if (действие is ВернутьРезультат) { return действие.Выполнить(this); } // просто в блоке вернуть не используется
                try
                {
                    действие.Выполнить(this);
                }
                catch (Exception exception)
                {
                    return("ошибка в " + действие + exception);
                }
            }
            return("готово");
        }
Пример #4
0
 public ПримитивИлиАдрес ВозращаемыйРезультат; // может быть и просто значение
 public override object Выполнить(План вызывающееДействие)
 {
     if (ВозращаемыйРезультат is План)
     {
         return(((План)ВозращаемыйРезультат).Выполнить(вызывающееДействие));
     }
     return(ВозращаемыйРезультат);
 }
Пример #5
0
        public override object Выполнить(План вызывающееДействие)
        {
            if (!ПроверитьОкружение())
            {
                return(null);                       // еще надо проверить
            }
            var результат = Метод.Invoke(Окружение, СписокЗначенийПеременных.ToArray());

            return(null);
        }
Пример #6
0
        public override object Выполнить(План вызывающееДействие)
        {
            СозданиеИндекса.Выполнить(this);

            while ((bool)УсловиеВыхода.Выполнить(this))
            {
                ТелоЦикла.Выполнить(this);
                ИзменеениеИндекса.Выполнить(this);
            }
            return("готово");
        }
Пример #7
0
        public override object Выполнить(План вызывающееДействие)
        {
            if (Значение.GetType() == Тип)
            {
                // проверить не занятость имени переменной

                вызывающееДействие.СловарьВнутреннихПеременных.Add(ИмяПеременной, Значение);
                return("готово");
            }

            return("ошибка типа");
        }
Пример #8
0
 //этот метод лучше убрать из функции преобразовать в список действий т.к. их всего 2 вызова
 private ЦелоеЧисло ПреобразоватьСлогаемое(План вызывающееДействие, ПримитивИлиАдрес параметр)
 {
     if (параметр is План)
     {
         return((ЦелоеЧисло)((План)слогаемое1).Выполнить(this));
     }
     else if (слогаемое1 is Строка) // это должно быть действие ПолучитьЗначениеПеременной
     {
         return((ЦелоеЧисло)вызывающееДействие.СловарьВнутреннихПеременных[((Строка)параметр).Значение]);
     }
     else
     {
         return((ЦелоеЧисло)параметр);
     }
 }
Пример #9
0
        public override object Выполнить(План вызывающееДействие)
        {
            ЦелоеЧисло[] слогаемое = new ЦелоеЧисло[2]; //это внутренние переменные



            слогаемое[0] = ПреобразоватьСлогаемое(вызывающееДействие, слогаемое1);
            слогаемое[1] = ПреобразоватьСлогаемое(вызывающееДействие, слогаемое2);


            езультатДействия = new ЦелоеЧисло()
            {
                Значение = слогаемое[0].Значение + слогаемое[1].Значение
            };

            return(езультатДействия);
        }
Пример #10
0
 public virtual object Выполнить(План вызывающееДействие)
 {
     return(null);
 }
Пример #11
0
 public override object Выполнить(План вызывающееДействие)
 {
     return(true);
 }
Пример #12
0
 public override object Выполнить(План вызывающееДействие)
 {
     // если такой переменной нет вернуть ошибку
     вызывающееДействие.СловарьВнутреннихПеременных[ИмяПеременной] = Значение;
     return("готово");
 }
Пример #13
0
 public override object Выполнить(План вызывающееДействие)
 {
     // нужен рекурсивный поиск переменной в вышележащих
     return(вызывающееДействие.СловарьВнутреннихПеременных[ИмяПеременной]);
 }
Пример #14
0
        public object Значение; //это может быть и действие

        public override object Выполнить(План вызывающееДействие)
        {
            вызывающееДействие.СловарьВнутреннихПеременных.Add(ИмяПеременной, Значение);
            return("готово");
        }
Пример #15
0
        public List <План> ТелоФункции; // в теле функции не нужно определять переменные с именем параметров, будет ошибка,т.к. при вызове она уже будет создана

        public override object Выполнить(План вызывающееДействие)
        {
            // определение функции в текущем контексте, можно выбрать другой контекст
            вызывающееДействие.ДобавитьПеременную(ИмяФункции, "функция", this); //вместо "функция" можно добавить "поле" "переменная" получиться класс
            return("готово");
        }
Пример #16
0
 internal bool Содержит(План инструкция)
 {
     throw new NotImplementedException();
 }