Языки программирования vs. Excel

6yrop

На каком языке программирования можно выполнять арифметические действия как в Excel-е? Хочется просто писать формулы и не думать о том, когда они вычисляются. Пример:

C = A + B
D = 2 * C + A

На C# это можно написать так

class Example
{
public int A
{
get
{
...
}
}

public int B
{
get
{
...
}
}

public int C
{
get
{
return A + B;
}
}

public int D
{
get
{
return 2 * C + A;
}
}
}

Но это дополнительная нагрузка на процессор — формула пересчитывается при каждом обращении.
Хочется, чтобы аргументы сообщали о своем изменении и формулы пересчитывались только при получении такого сообщения. (Возможно пакетное изменение аргументов, в примере изменение A, B может быть объединено в один пакет и пересчет должен быть выполнен один раз.)
Если кто знает реализацию такого на C#/Java поделитесь или дайте ссылку
Функциональные языки такое могу?

artimon

Metapost =)
http://en.wikipedia.org/wiki/Lazy_evaluation — ты этого хочешь?

6yrop

имхо, нет

timefim

Хочется, чтобы аргументы сообщали о своем изменении и формулы пересчитывались только при получении такого сообщения.
Подписывайся на ивенты и пересчитывай.

artimon

Тогда я не понял…
В MetaPost'е можно написать:
a = b + c;
b = a - 3;
a = 10;
show a, b, c;
получится:
>> 10
>> 7
>> 3

timefim

При следующем вызове show a, b, c;
они не пересчитываются?

6yrop

Подписывайся на ивенты и пересчитывай.
если у тебя есть красивая реализаация, поделись плиз . Если самому это делать, то такое чувство, что велосипед изобретаешь

6yrop

+1

6yrop

получится:
важен не только результат, в примере на C# результат такой же. Тут еще нагрузка на процессор важна.

timefim

Нету.
Excel пересчитывает только те ячейки, которые зависят от той

А может он все пересчитывает?

6yrop

А может он все пересчитывает?
зачем это ему. Можно даже проверить, написать свою формулу, например, с мессаджбоксом.
проверил, не все пересчитывает.

Vladu

если у тебя есть красивая реализаация, поделись плиз . Если самому это делать, то такое чувство, что велосипед изобретаешь
SICP: 3.3.4 A Simulator for Digital Circuits

6yrop

и где там реализация?

Marinavo_0507

An Exception Has Occurred
cell-cultures/cells: unknown location
HTTP Response Status
404 Not Found
Python Traceback
Traceback (most recent call last):
File "/usr/lib/python2.3/site-packages/viewcvs/viewcvs.py", line 3235, in main
request.run_viewcvs
File "/usr/lib/python2.3/site-packages/viewcvs/viewcvs.py", line 317, in run_viewcvs
% self.where, '404 Not Found')
ViewCVSException: 404 Not Found: cell-cultures/cells: unknown location

vook

Python?

SPARTAK3959

Есть JavaFX где можно создавать свойства, зависящие от других свойств, при этом пересчет идет автоматически (реализовано это через сообщения об изменении, конечно).

bleyman

Если речь идёт именно об арифметических действиях, то нужно очень концептуальную формулу придумать, чтобы что-нибудь такое хитроумное вывело тебя в плюс по времени =)
А так — ты вообще хочешь кеширования, если что. И dirty flag, распространяющийся при изменении какого-нибудь входа. Вот в этом направлении и ищи, какой-нибудь кеширующий фреймворк, который позволит брать достаточно большие (чтобы в плюсе оказаться) под-формулы (или вообще алгоритмы, неважно) и оборачивать их в кеширующую обёртку, даже с автоматическим отслеживанием dependencies может быть.

6yrop

Если речь идёт именно об арифметических действиях, то нужно очень концептуальную формулу придумать, чтобы что-нибудь такое хитроумное вывело тебя в плюс по времени =)
ничего придумывать не надо, к сожалению, это реальность. На C# выполняется около 10^6 операций деления в секунду. У нас есть бизнес-сущность, которая объединяет коллекцию других сущностей. Количество элементов в коллекции бывает порядка 90. В каждой сущности порядка 30 формул, вот уже получаем 60*90=6300 формул. Если еще учесть зависимости, то еще получаем множитель 3 (а то и 10). Т.е. на одну большую сущность получаем 16200 операций. Если на сервер одновременно зайдут 100 пользователей уже будут проблемы.

nawok

Мне кажется то, что ты ищешь называется Dataflow architecture. Попробуй погуглить на эту тему.

6yrop

о , возможно, завтра посмотрю повнимательнее
Спасибо
Оставить комментарий
Имя или ник:
Комментарий: