Me gustaría entender cómo se resuelve una hoja de cálculo (un grupo de celdas con nombre o identificadas que contienen valores o fórmulas que hacen referencia a otras celdas). Intenté mirar los proyectos existentes, pero sucedía tanto con la GUI, la serialización, los eventos, etc., que no pude encontrar la hoja de cálculo.
En su forma más simple, ¿cómo funciona?
design
algorithms
hildred
fuente
fuente
Respuestas:
En esencia, una hoja de cálculo es un lenguaje funcional con tipeo dinámico y cada función o valor puede ser referenciado como una celda en la matriz.
En lugar de cosas como
(defn some-name ...)
lasome-name
parte se coloca en una celda.Si va a una actualización dinámica de ide de lenguaje funcional (como lighttable para clojure), verá mucha de la misma funcionalidad que una hoja de cálculo. Vincula un valor a un nombre, escribe una función que use ese valor, cambia el valor y la salida de la función cambia inmediatamente. Esto es lo mismo que hacer algo como escribir
=A1 + B2
en la ubicación deC3
in excel.Por lo tanto, a los programadores funcionales a menudo les gusta escribir hojas de cálculo como programas de juguetes ... y también el tema de trabajos de investigación. (Sí, lo siento, todos están detrás de un muro de pago de ACM.org)
Programación funcional de hoja de cálculo
Formas / 3: un lenguaje visual de primer orden para explorar los límites del paradigma de la hoja de cálculo
Implementando hojas de cálculo de funciones
El inicio de la hoja de cálculo en Wikipedia ofrece algunos consejos sobre cómo implementar uno:
Partiendo de esto a partir del esquema del paradigma Modelo-Vista-Controlador como se expresa en las bibliotecas Java . El autor continúa mencionando applets (un poco anticuado, fue escrito en '93 -'96) y menciona su página web que va a http://csis.pace.edu/~bergin/Java/applets.htm (sí , applets) para el código de hoja de cálculo correspondiente http://csis.pace.edu/~bergin/Java/Spreadsheet.java
Señalaré que la totalidad de la hoja de cálculo no es tan grande en este applet 570 líneas, incluida la documentación.
Dicho esto, dependiendo del idioma, probablemente podría hacerlo todo con solo punteros de función en una matriz dispersa.
fuente
Conceptualmente, cada celda es un nodo de un gráfico acíclico dirigido , y las referencias a otras celdas crean bordes en ese gráfico. Cuando cambia una celda, una clasificación topológica de todos los nodos accesibles desde la celda que cambió le dará el orden que necesita para evaluar las celdas. Una vez que haya determinado el orden correcto, es solo el análisis de expresiones estándar.
fuente
Como ya se mencionó, una hoja de cálculo se implementa fácilmente como un DAG (gráfico acíclico dirigido) almacenado en un simple hash o diccionario. Algún código simple para jugar es probablemente la forma más fácil de entenderlo:
Una versión muy simple de Python: http://code.activestate.com/recipes/355045-spreadsheet/
Esto fue explicado y elaborado en esta publicación de blog: http://ralsina.me/weblog/posts/BB585.html
También hay una versión simple de JavaScript con una GUI aquí: http://jsfiddle.net/ondras/hYfN3/
fuente
He codificado un paquete de Python que le permite convertir la estructura de celdas de función objetivo del archivo MS Excel en Python. XL2py
Los valores de celda se analizan en un objeto tipo dict () que agrega sus valores. Las celdas con referencias a otras celdas por fórmulas comprenden nodos. Los nodos se refieren a una celda cuyo valor está definido por su fórmula. A partir de cada fórmula de nodo, se define una estructura de dependencia para definir si existen referencias circulares o no. Las órdenes de cálculo de nodos se definen teniendo en cuenta las estructuras de dependencia de las células involucradas.
A partir de la estructura de árbol de E / S, puede utilizar cualquier algoritmo de minimización implementado en Python como lo desee.
Te sugiero que eches un vistazo a https://github.com/gusmaogabriels/XL2py
Saludos cordiales, Gabriel
fuente