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 Выполнить(План вызывающееДействие) { ВышестоящийПлан = вызывающееДействие;// для доступа к вышележащим переменным СоздатьСписокПеременных(); for (var индекс = 0; индекс < СписокДействий.Count;) { var действие = СписокДействий[индекс]; if (действие is Прервать) { return("прервать"); } if (действие is ПерейтиК) { индекс = СписокДействий.FindIndex(план => план.Метка == ((ПерейтиК)действие).МеткаКуда); } try { действие.Выполнить(this); } catch (Exception exception) { return("ошибка в " + действие + exception); } индекс++; } return("готово"); }
public List <ОпределениеПоля> СписокОпределенияПолей; // например имена полей это может быть список внутренних переменных public override object Выполнить(План вызывающееДействие) // это может быть и не действие а другой класс { вызывающееДействие.СловарьВнутреннихПеременных.Add(ИмяКласса, this); вызывающееДействие.СловарьТипизированныхПеременных.Add(ИмяКласса, new ТипизированноеЗначение() { ИмяТипа = "Определение Типа", Значение = this }); // проверить незанятость Имени Типа bool имяЗанято = вызывающееДействие.СписокТипизированныхПеременных.Exists(пер => пер.ИмяПеременной == ИмяКласса); if (!имяЗанято) { var новыйКласс = new ОпределениеКласса() { ИмяКласса = ИмяКласса, СписокОпределеныхПолей = СписокОпределенияПолей }; вызывающееДействие.СписокТипизированныхПеременных.Add(new ТипизированнаяПеременная() { ИмяПеременной = ИмяКласса, ИмяТипа = "Определение Типа", Значение = новыйКласс // или this, это если данные совпадают с действием }); } else { return("имя занято"); } return("готово"); }
public АМОбъект ВозращаемыйРезультат; // может быть и просто значение public override object Выполнить(План вызывающееДействие) { if (ВозращаемыйРезультат is План) { return(((План)ВозращаемыйРезультат).Выполнить(вызывающееДействие)); } return(ВозращаемыйРезультат); }
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 override object Выполнить(План вызывающееДействие) { var определениеПолей = экземпляр.Класс.СписокОпределеныхПолей; int номерПоля = экземпляр.Класс.ДайНомерПоля(ИмяПоля); if (номерПоля == -1) { return("ошибка: нет такого поля"); } var типПоля = определениеПолей[номерПоля].ИмяТипа; if (типПоля != ((ЭкземплярКласса)ПрисваиваемоеЗначение).Класс.ИмяКласса) { return("ошибка: несовпадение типов"); } экземпляр.СписокЗначений[номерПоля] = ( АМОбъект)ПрисваиваемоеЗначение; return("готово"); }
public override object Выполнить(План вызывающееДействие) { var определениеКласса = (ОпределениеКласса)вызывающееДействие.СловарьВнутреннихПеременных[ИмяКласса]; var экземпляр = new ЭкземплярКласса { Класс = определениеКласса, СписокЗначений = new List <АМОбъект> { Capacity = определениеКласса.СписокОпределеныхПолей.Count // ограничение в создании полей } }; езультатДействия = экземпляр; foreach (var определениеПоля in определениеКласса.СписокОпределеныхПолей) { // создать экземпляры классов для всех полей } return(езультатДействия); return("готово"); }
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("готово"); }