Страница 1 из 2
					
				Игры с Evaluate
				Добавлено: 05 Август 2023, 18:09
				 Губин Игорь
				Потребовалось включить в программу простое вычисление по наборам строк, задаваемым пользователем.
Идеально подходит Evaluate.
С результатом логических операций всё предельно просто, а вот с операциями присвоения сложности.
Т.е. Evaluate('A > 2') - логическая операция, результат 1/0, всё просто и понятно.
А вот с операцией присвоения сложности. С точки зрения удобства и однотипности хорошо бы написать что-нибудь в стиле Evaluate('B = 10*A'), но это воспринимается как логическая операция.
Нет ли какой фичи для подобного?
P.S. Идея с вызовом в Evaluate внешней функции для присвоения понятна, но не совсем удобна.
P.P.S. Можно написать свой интерпретатор, но это не лучший выход, т.к. процесс ресурсоёмкий и не быстрый, а тут скорость поставлена во главу угла.
P.P.P.S. Идея подключать внешний интерпретатор, типа того же питона, не подходит. Программа организована по принципу "всё в одном, никаких дополнительно устанавливаемых модулей, работаем везде и при самом глупом сисадмине"
			 
			
					
				Игры с Evaluate
				Добавлено: 05 Август 2023, 18:59
				 kreator
				Почему не нравится вот такая однотипность:
B = evaluate('10A')
B = evaluate('A > 2')
?
			 
			
					
				Игры с Evaluate
				Добавлено: 05 Август 2023, 19:12
				 Губин Игорь
				kreator писал(а): 05 Август 2023, 18:59
Почему не нравится вот такая однотипность:
 
Потому, что возможен, одновременно, такой набор
A > 5.0
C = 10*B + D
E < 0.1*C
F = E + B
И вот таких переменных может быть под десяток в различнейших, заранее неизвестных сочетаниях. Отделить логические выражения от вычисляемых заранее, до вычислений возможно, но вот предсказать весь набор присвоений... 
Если бы была фича, то всё было бы просто: прогнал в цикле вычисляемые, а затем, в другом цикле, логические. А без неё, каждое вычисляемое надо разбирать на присвоение и нужной переменной.
 
			 
			
					
				Игры с Evaluate
				Добавлено: 05 Август 2023, 19:55
				 Дед Пахом
				P.P.P.P.S. Можно же подключить тот же vbscript, условию "всё в одном, никаких дополнительно устанавливаемых модулей, работаем везде и при самом глупом сисадмине" удовлетворяет.
			 
			
					
				Игры с Evaluate
				Добавлено: 05 Август 2023, 19:59
				 finsoftrz
				Вместо глупого может очень умный попасться и отключить vbscript нафиг...
			 
			
					
				Игры с Evaluate
				Добавлено: 05 Август 2023, 20:04
				 Дед Пахом
				Не знал, что это возможно, кстати как?
Ладно, вместо vbscript можно javascript.
			 
			
					
				Игры с Evaluate
				Добавлено: 05 Август 2023, 20:05
				 kreator
				Губин Игорь писал(а): 05 Август 2023, 19:12
Потому, что возможен, одновременно, такой набор
A > 5.0
C = 10*B + D
E < 0.1*C
F = E + B
 
Тогда мне непонятно. Как одновременно? И что надо получить? Из первого поста вроде бы понятно - надо "B" получить.
 
			 
			
					
				Игры с Evaluate
				Добавлено: 05 Август 2023, 20:08
				 finsoftrz
				Можно попробовать использовать bindexpression. То есть результат вычисления сохранить куда-нибудь в очередь и доставать из нее значение по имени переменной. Что-то типа такого:
B = Evaluate('10*A')
setVar('B', B)
bindexpression('B', 'getVAr(''B'')')
			 
			
					
				Игры с Evaluate
				Добавлено: 05 Август 2023, 20:09
				 Губин Игорь
				Дед Пахом писал(а): 05 Август 2023, 19:55
P.P.P.P.S. Можно же подключить тот же vbscript, условию "всё в одном, никаких дополнительно устанавливаемых модулей, работаем везде и при самом глупом сисадмине" удовлетворяет.
 
Wine?  

 Нет, можно, но это дополнительные внешние модули. Да и вызов vbscript 100000 раз за 10 секунд (реальные цифры) не вызовет ли излишнюю нагрузку на компьютер?  
 
Кстати, тут, намедни, встретилась контора в которой у пользователей закрыты права записи, кроме одного единственного каталога на всём компьютере. И да, это, отнюдь, не Мои документы...  

 
			 
			
					
				Игры с Evaluate
				Добавлено: 05 Август 2023, 20:12
				 finsoftrz
				finsoftrz писал(а): 05 Август 2023, 20:08
Можно попробовать использовать bindexpression. То есть результат вычисления сохранить куда-нибудь в очередь и доставать из нее значение по имени переменной. Что-то типа такого:
B = Evaluate('10*A')
setVar('B', B)
bindexpression('B', 'getVAr(''B'')')
 
Не, просто bind.
 
			 
			
					
				Игры с Evaluate
				Добавлено: 05 Август 2023, 20:14
				 finsoftrz
				Дед Пахом писал(а): 05 Август 2023, 20:04
Не знал, что это возможно, кстати как?
Ладно, вместо vbscript можно javascript.
 
Сорри, для ответа на этот вопрос лучше погуглить типа "отключить vbs windows 10:.  

 
			 
			
					
				Игры с Evaluate
				Добавлено: 05 Август 2023, 20:15
				 Губин Игорь
				finsoftrz писал(а): 05 Август 2023, 20:08
Можно попробовать использовать bindexpression.
 
Это те же яйца с предварительным разбором формул.
kreator писал(а): 05 Август 2023, 20:05
Тогда мне непонятно. Как одновременно? И что надо получить? Из первого поста вроде бы понятно - надо "B" получить.
 
В каждой проверяемой записи надо проверить все логические условия, в которых могут использоваться, а могут и нет, не только значения полей из записи, но и результаты вычисляемых выражений по этим полям.
 
			 
			
					
				Игры с Evaluate
				Добавлено: 05 Август 2023, 20:17
				 Губин Игорь
				Дед Пахом писал(а): 05 Август 2023, 20:04
Ладно, вместо vbscript можно javascript.
 
И чем это лучше?  

 
			 
			
					
				Игры с Evaluate
				Добавлено: 05 Август 2023, 20:18
				 finsoftrz
				Губин Игорь писал(а): 05 Август 2023, 20:15
finsoftrz писал(а): 05 Август 2023, 20:08
Можно попробовать использовать bindexpression.
 
Это те же яйца с предварительным разбором формул.
 
Ну, не совсем разбор, достаточно найти первый "=". Других вариантов я не знаю, скорее всего, их и нет.
 
			 
			
					
				Игры с Evaluate
				Добавлено: 05 Август 2023, 20:19
				 Дед Пахом