public override object Выполнить(План вызывающееДействие) { bool значениеУсловия; проверкаУсловия : значениеУсловия = (bool)УсловиеВыхода.Выполнить(this); if (значениеУсловия == true) { var команда = (string)ТелоЦикла.Выполнить(this); if (команда == "готово") { goto проверкаУсловия; } if (команда == "продолжить") { goto проверкаУсловия; } if (команда == "прервать") { return("готово"); //выход из цикла = break } } return("готово"); }
public override object Выполнить(План вызывающееДействие) { // найти определение функции в полученном окружении // здесь только var определениеФункции = (ОпределениеФункции)вызывающееДействие.ЗначениеПеременной(ИмяФункции); //создать контекст //СловарьВнутреннихПеременных = new Dictionary<string, object>(); СоздатьСписокПеременных(); // присвоить значение переданных параметров в текущий контекст foreach (var параметр in СписокИменованныхПараметров) { СловарьВнутреннихПеременных.Add(параметр.Key, параметр.Value); //значение параметра может быть действие = значение другой переменной или адрес этой переменной // ПолучитьЗначениеПеременной{переменая=Имя}результат будет либо адрес либо примитив, примитив надо полностью копировать //ПолучитьАдресПеременной(переменная=Имя), в функции появиться дубль внешней переменной , примитив тоже храниться по адресу в некоторой группе } // запустить список Действий, используется один список действий из определения, но с разным контекстом foreach (var действие in определениеФункции.ТелоФункции) { if (действие is ВернутьРезультат) { езультат = действие.Выполнить(this); break; } действие.Выполнить(this); } //вернуть результат return(езультат); }
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("готово"); }
public ПримитивИлиАдрес ВозращаемыйРезультат; // может быть и просто значение public override object Выполнить(План вызывающееДействие) { if (ВозращаемыйРезультат is План) { return(((План)ВозращаемыйРезультат).Выполнить(вызывающееДействие)); } return(ВозращаемыйРезультат); }
public override object Выполнить(План вызывающееДействие) { if (!ПроверитьОкружение()) { return(null); // еще надо проверить } var результат = Метод.Invoke(Окружение, СписокЗначенийПеременных.ToArray()); return(null); }
public override object Выполнить(План вызывающееДействие) { СозданиеИндекса.Выполнить(this); while ((bool)УсловиеВыхода.Выполнить(this)) { ТелоЦикла.Выполнить(this); ИзменеениеИндекса.Выполнить(this); } return("готово"); }
public override object Выполнить(План вызывающееДействие) { if (Значение.GetType() == Тип) { // проверить не занятость имени переменной вызывающееДействие.СловарьВнутреннихПеременных.Add(ИмяПеременной, Значение); return("готово"); } return("ошибка типа"); }
//этот метод лучше убрать из функции преобразовать в список действий т.к. их всего 2 вызова private ЦелоеЧисло ПреобразоватьСлогаемое(План вызывающееДействие, ПримитивИлиАдрес параметр) { if (параметр is План) { return((ЦелоеЧисло)((План)слогаемое1).Выполнить(this)); } else if (слогаемое1 is Строка) // это должно быть действие ПолучитьЗначениеПеременной { return((ЦелоеЧисло)вызывающееДействие.СловарьВнутреннихПеременных[((Строка)параметр).Значение]); } else { return((ЦелоеЧисло)параметр); } }
public override object Выполнить(План вызывающееДействие) { ЦелоеЧисло[] слогаемое = new ЦелоеЧисло[2]; //это внутренние переменные слогаемое[0] = ПреобразоватьСлогаемое(вызывающееДействие, слогаемое1); слогаемое[1] = ПреобразоватьСлогаемое(вызывающееДействие, слогаемое2); езультатДействия = new ЦелоеЧисло() { Значение = слогаемое[0].Значение + слогаемое[1].Значение }; return(езультатДействия); }
public virtual object Выполнить(План вызывающееДействие) { return(null); }
public override object Выполнить(План вызывающееДействие) { return(true); }
public override object Выполнить(План вызывающееДействие) { // если такой переменной нет вернуть ошибку вызывающееДействие.СловарьВнутреннихПеременных[ИмяПеременной] = Значение; return("готово"); }
public override object Выполнить(План вызывающееДействие) { // нужен рекурсивный поиск переменной в вышележащих return(вызывающееДействие.СловарьВнутреннихПеременных[ИмяПеременной]); }
public object Значение; //это может быть и действие public override object Выполнить(План вызывающееДействие) { вызывающееДействие.СловарьВнутреннихПеременных.Add(ИмяПеременной, Значение); return("готово"); }
public List <План> ТелоФункции; // в теле функции не нужно определять переменные с именем параметров, будет ошибка,т.к. при вызове она уже будет создана public override object Выполнить(План вызывающееДействие) { // определение функции в текущем контексте, можно выбрать другой контекст вызывающееДействие.ДобавитьПеременную(ИмяФункции, "функция", this); //вместо "функция" можно добавить "поле" "переменная" получиться класс return("готово"); }
internal bool Содержит(План инструкция) { throw new NotImplementedException(); }