Страница 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
Дед Пахом