Страница 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? :dizzy: Нет, можно, но это дополнительные внешние модули. Да и вызов vbscript 100000 раз за 10 секунд (реальные цифры) не вызовет ли излишнюю нагрузку на компьютер? :?:

Кстати, тут, намедни, встретилась контора в которой у пользователей закрыты права записи, кроме одного единственного каталога на всём компьютере. И да, это, отнюдь, не Мои документы... :facepalm:

Игры с 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:. :D

Игры с 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.
И чем это лучше? :nono:

Игры с Evaluate

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

Игры с Evaluate

Добавлено: 05 Август 2023, 20:19
Дед Пахом
Губин Игорь писал(а): 05 Август 2023, 20:09Wine?
Я и слов таких не знаю.