Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 01.01.2013, 10:45
ShamanGood вне форума Посмотреть профиль Отправить личное сообщение для ShamanGood Найти все сообщения от ShamanGood
  № 1  
Ответить с цитированием
ShamanGood

Регистрация: Dec 2012
Сообщений: 4
По умолчанию Вычислить условное выражение, если оно представленно как строка

Здравствуйте.
Зашел в тупик и долго искал в поисковиках, но пока без результатно.
Возможно ли простое/не простое решение следующей задачи:

var A = 5;
var B = 4;

затем из XML приходит строка "A>B", помещенная в пременную var condition = "A>B"

Возможно ли как то превратить condition в действительно условное выражение, чтобы типа:

if ( [какое-то превращение condition в выражение] ) { trace("true") } else { trace("false") }

Спасибо.

Старый 01.01.2013, 17:39
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Да только парсить строку. Здесь уже все зависит от сложности выражений, допускаются ли комбинированные (типа (A + B) < C), сложные логические (типа (A > B) && (B <= C) || (A == C)) и вообще любое допущение вариантов формата создаст огромные сложности. Ну а если простое сравнение двух операндов, то несложно. Только нужны свойства уровня экземпляра для хранения сравниваемых значений — локальные переменные функции не подходят.
Код AS3:
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
 
	/**
	 * ...
	 * @author wolsh
	 */
	public class Main extends Sprite 
	{
		public var a:uint = 10;
		public var b:uint = 8;
 
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			var string:String = "a > b";
 
			var regexp:RegExp = /([\w\d]+)\s?([><!=]+)\s?([\w\d]+)/;
			var proper:Boolean = regexp.test(string);
			if (proper)
			{
				var result:Array = string.match(regexp);
				var operand1:Object = this[result[1]];
				var operator:String = result[2];
				var operand2:Object = this[result[3]];
				trace(operate(operand1, operand2, operator));
			}
		}
 
		private function operate(o1:Object, o2:Object, operator:String):Boolean 
		{
			var result:Boolean;
			switch(operator)
			{
				case ">" : result = o1 > o2;
				break;
				case "<" : result = o1 < o2;
				break;
				case "==" : result = o1 == o2;
				break;
				case "!=" : result = o1 != o2;
				break;
				case "===" : result = o1 === o2;
				break;
				case "!==" : result = o1 !== o2;
				break;
				case ">=" : 
				case "=>" : result = o1 >= o2;
				break;
				case "<=" : 
				case "=<" : result = o1 <= o2;
				break;
			}
			return result;
		}
	}
}
__________________
Reality.getBounds(this);

Старый 01.01.2013, 19:40
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 3  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
http://code.google.com/p/flash-embedded-language/

Я писал когда-то очень простенький интерпретатор. Можно тут посмотреть, если нужно что-то более продвинутое, чем парсер на основе регулярной грамматики.

Что из вашего вопроса не понятно - так это описание того, чем являются выражения A и B. В зависимости от этого нужно решать проблему. Если известно, что А и В - терминалы, тогда нужно будет только немного переделать код Wolsh'a для того, чтобы он делал ленивые вычисления (т.е. чтобы выражения "А или В" не вычисляли В если А истинно, и "А и Б" не вычисляли Б, если А ложно.
Но если А или Б могут быть не терминалами, тогда все становится гораздо сложнее... И еще сложнее, если А и Б могут зависеть от контекста.
__________________
Hell is the possibility of sanity

Старый 02.01.2013, 00:37
ShamanGood вне форума Посмотреть профиль Отправить личное сообщение для ShamanGood Найти все сообщения от ShamanGood
  № 4  
Ответить с цитированием
ShamanGood

Регистрация: Dec 2012
Сообщений: 4
Спасибо огромное. Многое выяснил.

Цитата:
Но если А или Б могут быть не терминалами, тогда все становится гораздо сложнее... И еще сложнее, если А и Б могут зависеть от контекста.
В то-то и дело, что это очень большое меню, приходящее в виде распарсенного JSON файла. И внутри каждого пункта хотелось выяснять disabled, visible и т.д. путем выполнения условия для каждого пункта. И не писать код для простых условий, а парсить строку из этого JSONa. Условия могут быть разные от "Logged" true/false , до сложных вычислений, результатом, которых будет true/false, поэтому без писания кода в теле класса - никак, наверное.
Я нашел решение пока.
У каждого пункта меню есть имя. Я создал объект, в котором под этими именами будут функции, а в ней уже и условия на disable, visible и т.д. и там же ссылка на функцию CLICK пункта меню.

Создать новую тему Ответ Часовой пояс GMT +4, время: 08:18.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 08:18.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.