J'aimerais comprendre comment une feuille de calcul (un groupe de cellules nommées ou autrement identifiées contenant des valeurs ou des formules faisant référence à d'autres cellules) est résolue. J'ai essayé de regarder des projets existants, mais il y avait tellement de choses avec l'interface graphique, la sérialisation, les événements, etc. que je n'ai pas pu trouver la feuille de calcul.
Au plus simple, comment ça marche?
design
algorithms
Hildred
la source
la source
Réponses:
Un tableur est essentiellement un langage fonctionnel avec typage dynamique, chaque fonction ou valeur pouvant être référencée sous forme de cellule dans la matrice.
Au lieu de choses comme
(defn some-name ...)
lasome-name
pièce est placée dans une cellule elle-même.Si vous passez à un ide de langage fonctionnel à mise à jour dynamique (tel que lighttable for clojure), vous verrez une grande partie des mêmes fonctionnalités qu'un tableur. Liez une valeur à un nom, écrivez une fonction qui utilise cette valeur, changez la valeur et la sortie de la fonction change immédiatement. C’est la même chose que de faire quelque chose comme écrire
=A1 + B2
à l’emplacement d’C3
excellent.Ainsi, les programmeurs fonctionnels aiment souvent écrire des tableurs sous forme de programmes de jouets ... et aussi de sujets de recherche. (Oui, je suis désolé, ils sont tous derrière un paywall ACM.org)
Programmation fonctionnelle de tableur
Forms / 3: Un langage visuel de premier ordre pour explorer les limites du paradigme du tableur
Mise en œuvre des feuilles de calcul
Le début de Spreadsheet sur Wikipedia donne quelques astuces pour en implémenter un:
S'appuyant sur ceci à partir du schéma du paradigme Model-View-Controller tel qu'il est exprimé dans les bibliothèques Java . L’auteur mentionne ensuite les applets (un peu daté, il a été écrit de 1993 à 1996) et mentionne sa page Web qui se trouve sur http://csis.pace.edu/~bergin/Java/applets.htm (oui , applets) pour le code de feuille de calcul correspondant http://csis.pace.edu/~bergin/Java/Spreadsheet.java
Je ferai remarquer que l'intégralité du tableur n'est pas si grande dans cette applet 570 lignes, y compris la documentation.
Cela dit, selon la langue, vous pouvez probablement tout faire avec uniquement des pointeurs de fonction dans un tableau fragmenté.
la source
Conceptuellement, chaque cellule est un nœud d'un graphe acyclique dirigé , et les références à d'autres cellules créent des arêtes dans ce graphe. Lorsque vous modifiez une cellule, un tri topologique de tous les nœuds accessibles depuis la cellule modifiée vous donnera l'ordre nécessaire pour évaluer les cellules. Une fois que vous avez déterminé le bon ordre, il ne reste plus que l'analyse syntaxique standard.
la source
Comme mentionné précédemment, un tableur est facilement implémenté sous forme de DAG (graphe acyclique dirigé) stocké dans un simple hachage ou un dictionnaire. Un code simple à utiliser est probablement le moyen le plus simple de le comprendre:
Une version très simple de Python: http://code.activestate.com/recipes/355045-spreadsheet/
Ceci a été expliqué et développé dans ce billet de blog: http://ralsina.me/weblog/posts/BB585.html
Il existe également une version JavaScript simple avec une interface graphique ici: http://jsfiddle.net/ondras/hYfN3/
la source
J'ai codé un paquet Python qui vous permet de convertir la structure de cellules de fonction d'objectif de fichier MS Excel en Python. XL2py
Les valeurs de cellule sont analysées dans un objet de type dict () qui ajoute leurs valeurs. Les cellules avec des références à d'autres cellules par des formules comprennent des nœuds. Les nœuds font référence à une cellule dont la valeur est définie par sa formule. A partir de chaque formule de nœud, une structure de dépendance est définie afin de définir si les références circulaires existent ou non. Les ordres de calcul de nœud sont définis en prenant en compte les structures de dépendance des cellules impliquées.
À partir de l'arborescence des E / S, vous pouvez utiliser à votre guise n'importe quel algorithme de minimisation implémenté en Python.
Je vous suggère de jeter un coup d'œil sur https://github.com/gusmaogabriels/XL2py
Cordialement, Gabriel
la source