Я хотел бы понять, как решается электронная таблица (группа именованных или иным образом идентифицированных ячеек, содержащих значения или формулы, ссылающиеся на другие ячейки). Я пытался посмотреть на существующие проекты, но с GUI, сериализацией, событиями и т. Д. Происходило так много всего, что я не смог найти электронную таблицу.
На самом простом, как это работает?
design
algorithms
hildred
источник
источник
Ответы:
По своей сути электронная таблица представляет собой функциональный язык с динамической типизацией, и на каждую функцию или значение можно ссылаться как на ячейку в матрице.
Вместо того , чтобы такие вещи , как
(defn some-name ...)
вsome-name
части помещается в самой клетке.Если вы перейдете к динамически обновляемому функциональному языку ide (например, lighttable for clojure), вы увидите большую часть тех же функций, что и в электронной таблице. Свяжите значение с именем, напишите функцию, которая использует это значение, измените значение, и результат функции изменится немедленно. Это то же самое, что делать что-то вроде письма
=A1 + B2
в месте расположенияC3
в Excel.Таким образом, функциональным программистам часто нравится писать электронные таблицы в виде игрушечных программ ... и предметом научных исследований тоже. (Да, извините, они все за платным доступом ACM.org)
Функциональное программирование электронных таблиц
Формы / 3: визуальный язык первого порядка для изучения границ парадигмы электронных таблиц
Реализация электронных таблиц функций
Запуск Spreadsheet в Википедии дает несколько советов о том, как его реализовать:
Основываясь на этом из парадигмы Outline of Model-View-Controller, как это выражено в библиотеках Java . Далее автор упоминает апплеты (немного устаревшие, они были написаны в 93–96 годах) и упоминает свою веб-страницу, которая находится по адресу http://csis.pace.edu/~bergin/Java/applets.htm (да , апплеты) для соответствующего кода электронной таблицы http://csis.pace.edu/~bergin/Java/Spreadsheet.java
Я укажу, что вся таблица не так велика в этом апплете, 570 строк, включая документацию.
Тем не менее, в зависимости от языка, вы, вероятно, могли бы делать все это только с помощью указателей на функции в разреженном массиве.
источник
Концептуально каждая ячейка является узлом ориентированного ациклического графа , а ссылки на другие ячейки создают ребра в этом графе. Когда вы меняете ячейку, топологическая сортировка всех узлов, доступных из ячейки, которую вы изменили, даст вам порядок, необходимый для оценки ячеек. Как только вы определили правильный порядок, это просто стандартный анализ выражения.
источник
Как уже упоминалось, электронная таблица легко реализуется как DAG (ориентированный ациклический граф), хранящийся в простом хеше или словаре. Некоторый простой код для игры, вероятно, самый простой способ понять это:
Очень простая версия Python: http://code.activestate.com/recipes/355045-spreadsheet/
Это было объяснено и разработано в этом сообщении в блоге: http://ralsina.me/weblog/posts/BB585.html
Здесь также есть простая версия JavaScript с графическим интерфейсом: http://jsfiddle.net/ondras/hYfN3/
источник
Я кодировал пакет Python, который позволяет преобразовывать структуру ячеек целевой функции файла MS Excel в Python. XL2py
Значения ячеек анализируются для объекта типа dict (), к которому добавляются их значения. Клетки со ссылками на другие клетки по формулам составляют узлы. Узлы относятся к ячейке, значение которой определяется ее формулой. Из каждой формулы узла определяется структура зависимости, чтобы определить, существуют ли циклические ссылки или нет. Порядок расчета узлов определяется с учетом структур зависимостей участвующих ячеек.
Что касается древовидной структуры ввода / вывода, вы можете использовать любой алгоритм минимизации, реализованный в Python, по своему желанию.
Я бы посоветовал вам взглянуть на https://github.com/gusmaogabriels/XL2py
С наилучшими пожеланиями, Габриэль
источник