Je voudrais comprendre comment un tableur (un groupe de cellules nommées ou autrement identifiées contenant des valeurs ou des formules référençant d'autres cellules) est résolu. 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.
À son plus simple, comment ça marche?
À la base, une feuille de calcul est un langage fonctionnel avec un typage dynamique et chaque fonction ou valeur pouvant être référencée en tant que cellule dans la matrice.
Au lieu de choses comme (defn some-name ...)
le some-name
la pièce est placée dans une cellule elle-même.
Si vous accédez à une idée de langage fonctionnel à mise à jour dynamique (telle qu'une table lumineuse pour clojure), vous verrez une grande partie des mêmes fonctionnalités qu'une feuille de calcul. Liez une valeur à un nom, écrivez une fonction qui utilise cette valeur, modifiez la valeur et la sortie de la fonction change immédiatement. Cela revient à faire quelque chose comme écrire =A1 + B2
à l'emplacement de C3
dans Excel.
Ainsi, les programmeurs fonctionnels aiment souvent écrire des feuilles de calcul sous forme de programmes jouets ... et font également l'objet de documents de recherche. (Oui, je suis désolé, ils sont tous derrière un mur de paiement ACM.org)
Programmation fonctionnelle du tableur
La communauté de programmation fonctionnelle a montré un certain intérêt pour les feuilles de calcul, mais étonnamment, personne ne semble avoir envisagé de faire fonctionner une feuille de calcul standard, telle qu'Excel, avec un langage de programmation fonctionnel standard, tel que Haskell. Dans cet article, nous montrons une façon de procéder. Nous espérons qu'en procédant ainsi, nous pourrons demander aux programmeurs de tableurs de faire un essai de programmation fonctionnelle.
Forms/3: Un langage visuel de premier ordre pour explorer les limites du paradigme du tableur
Bien que les détracteurs de la programmation fonctionnelle prétendent parfois que la programmation fonctionnelle est trop difficile ou contre-intuitive pour la plupart des programmeurs à comprendre et à utiliser, des preuves du contraire peuvent être trouvées en examinant la popularité des feuilles de calcul. Le paradigme de feuille de calcul, un sous-ensemble de premier ordre du paradigme de programmation fonctionnelle, a été largement accepté par les programmeurs et les utilisateurs finaux. Néanmoins, la plupart des systèmes de tableurs présentent de nombreuses limitations. Dans cet article, nous discutons des fonctionnalités du langage qui éliminent plusieurs de ces limitations sans s'écarter du modèle d'évaluation déclarative de premier ordre.
Mise en œuvre des feuilles de calcul de fonction
Une grande partie du développement de l'utilisateur final se fait avec des feuilles de calcul. La métaphore du tableur est attrayante car elle est visuelle et permet une expérimentation interactive, mais comme l'ont observé Peyton Jones, Blackwell et Burnett, la métaphore du tableur n'admet même pas l'abstraction la plus élémentaire: celle de transformer une expression en une fonction nommée. Ils ont donc proposé un moyen de définir une fonction en termes de feuille de calcul avec des cellules d'entrée et de sortie désignées; nous l'appellerons une feuille de fonction.
Le début de Feuille de calcul sur Wikipedia donne quelques conseils sur la façon de l'implémenter:
Une feuille de calcul est un programme d'application informatique interactif pour l'organisation et l'analyse des données sous forme de tableau. Feuilles de calcul développées sous forme de simulations informatisées de feuilles de calcul papier. Le programme fonctionne sur des données représentées comme des cellules d'un tableau, organisées en lignes et en colonnes. Chaque cellule du tableau est un élément modèle-vue-contrôleur qui peut contenir des données numériques ou textuelles, ou les résultats de formules qui calculent et affichent automatiquement une valeur en fonction du contenu des autres cellules.
S'appuyant sur cela de Aperçu du paradigme Model-View-Controller tel qu'exprimé dans les Java . L'auteur poursuit en mentionnant les applets (un peu daté, il a été écrit en '93 -'96) et mentionne sa page Web qui va à 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 soulignerai que l'intégralité de la feuille de calcul, n'est pas si grande dans cette applet 570 lignes, y compris la documentation.
Cela dit, selon la langue, vous pourriez probablement tout faire avec des pointeurs de fonction dans un tableau clairsemé.
Conceptuellement, chaque cellule est un nœud d'un graphique acyclique dirigé , et les références à d'autres cellules créent des bords dans ce graphique. Lorsque vous modifiez une cellule, un tri topologique de tous les nœuds accessibles depuis la cellule que vous avez modifiée vous donnera l'ordre dont vous avez besoin pour évaluer les cellules. Une fois que vous avez déterminé l'ordre correct, il s'agit simplement d'une analyse d'expression standard.
Comme déjà mentionné, une feuille de calcul est facilement implémentée sous la forme d'un DAG (graphique acyclique dirigé) stocké dans un hachage ou un dictionnaire simple. Un code simple pour jouer est probablement le moyen le plus simple de le comprendre:
Une très simple Python: http://code.activestate.com/recipes/355045-spreadsheet/
Cela 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/
J'ai codé un package python qui vous permet de convertir la structure des cellules de fonction objectif du fichier MS Excel en Python. XL2py
Les valeurs des cellules sont analysées dans un objet de type dict () 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 noeud, une structure de dépendance est définie de manière à définir s'il existe ou non des références circulaires. Node les ordres de calcul sont définis en tenant compte des structures de dépendance des cellules impliquées.
À partir de l'arborescence d'E/S, vous pouvez utiliser n'importe quel implémentation d'algorithme de minimisation dans Python comme vous le souhaitez).
Je vous suggère de jeter un œil à https://github.com/gusmaogabriels/XL2py
Cordialement, Gabriel