Quali sono le strutture dati dietro un foglio di calcolo?

30

Vorrei capire come viene risolto un foglio di calcolo (un gruppo di celle identificate o identificate che contengono valori o formule che fanno riferimento ad altre celle). Ho provato a guardare i progetti esistenti, ma c'era così tanto da fare con la GUI, la serializzazione, gli eventi, ecc. Che non riuscivo a trovare il foglio di calcolo.

Nel modo più semplice come funziona?

    
posta hildred 23.11.2013 - 08:35
fonte

4 risposte

21

Essenzialmente, un foglio di calcolo è un linguaggio funzionale con digitazione dinamica e ogni funzione o valore può essere referenziato come una cella nella matrice.

Invece di cose come (defn some-name ...) la parte some-name viene inserita in una cella stessa.

Se si passa a un ide del linguaggio funzionale che si aggiorna in modo dinamico (come lighttable per clojure), si vedrà la stessa funzionalità di un foglio di calcolo. Associare un valore a un nome, scrivere una funzione che utilizza quel valore, modificare il valore e l'output della funzione cambia immediatamente. È come fare qualcosa come scrivere =A1 + B2 nel percorso di C3 in excel.

Quindi, i programmatori funzionali spesso amano scrivere fogli di calcolo come programmi giocattolo ... e anche i documenti di ricerca. (Sì, mi dispiace, sono tutti dietro un paywall ACM.org)

  • Programmazione funzionale del foglio di lavoro

    The functional programming community has shown some interest in spreadsheets, but surprisingly no one seems to have considered making a standard spreadsheet, such as Excel, work with a standard functional programming language, such as Haskell. In this paper, we show one way that this can be done. Our hope is that by doing so, we might get spreadsheet programmers to give functional programming a try.

  • Forms / 3: Un linguaggio visivo di primo ordine per esplorare i confini del paradigma del foglio di lavoro

    Although detractors of functional programming sometimes claim that functional programming is too difficult or counter-intuitive for most programmers to understand and use, evidence to the contrary can be found by looking at the popularity of spreadsheets. The spreadsheet paradigm, a first-order subset of the functional programming paradigm, has found wide acceptance among both programmers and end users. Still, there are many limitations with most spreadsheet systems. In this paper, we discuss language features that eliminate several of these limitations without deviating from the first-order, declarative evaluation model.

  • Implementazione di fogli di calcolo delle funzioni

    A large amount of end-user development is done with spreadsheets. The spreadsheet metaphor is attractive because it is visual and accommodates interactive experimentation, but as observed by Peyton Jones, Blackwell and Burnett, the spreadsheet metaphor does not admit even the most basic abstraction: that of turning an expression into a named function. Hence they proposed a way to define a function in terms of a worksheet with designated input and output cells; we shall call it a function sheet.

L'inizio di Foglio di calcolo su Wikipedia fornisce alcuni suggerimenti su come implementarlo:

A spreadsheet is an interactive computer application program for organization and analysis of data in tabular form. Spreadsheets developed as computerized simulations of paper accounting worksheets. The program operates on data represented as cells of an array, organized in rows and columns. Each cell of the array is a model–view–controller element that can contain either numeric or text data, or the results of formulas that automatically calculate and display a value based on the contents of other cells.

Basandosi su questo Schema del paradigma Model-View-Controller come espresso nelle librerie Java . L'autore continua a menzionare le applet (un po 'datate, è stato scritto nel '93 -'96) e menziona la sua pagina web che va a link (sì, applet) per il corrispondente codice del foglio di calcolo link

Sottolineerò che l'intero foglio di calcolo non è così grande in questa 570 righe di applet, inclusa la documentazione.

Detto questo, a seconda della lingua, probabilmente potresti fare tutto con solo i puntatori di funzione in una matrice sparsa.

    
risposta data 23.11.2013 - 18:30
fonte
30

Concettualmente, ogni cella è un nodo di un grafico aciclico diretto , mentre i riferimenti ad altre celle creano bordi in quel grafico . Quando modifichi una cella, un ordinamento topologico di tutti i nodi raggiungibili dalla cella che hai modificato ti darà l'ordine di cui hai bisogno valutare le cellule. Una volta determinato l'ordine corretto, è solo l'analisi dell'espressione standard.

    
risposta data 23.11.2013 - 10:35
fonte
5

Come già accennato, un foglio di calcolo è facilmente implementabile come DAG (grafico aciclico diretto) memorizzato in un semplice hash o dizionario. Qualche semplice codice con cui giocare è probabilmente il modo più semplice per comprenderlo:

Una versione Python molto semplice: link

Questo è stato spiegato ed elaborato in questo post del blog: link

C'è anche una semplice versione JavaScript con una GUI qui: link

    
risposta data 26.11.2013 - 23:29
fonte
0

Ho codificato un pacchetto python che consente di convertire la struttura delle celle della funzione obiettivo obiettivo di MS Excel in Python. XL2py

I valori delle celle vengono analizzati su un oggetto di tipo dict () che aggiunge i loro valori. Le celle con riferimenti ad altre celle per formule comprendono nodi. I nodi si riferiscono a una cella il cui valore è definito dalla sua formula. Da ogni formula di nodo, viene definita una struttura di dipendenza in modo da definire se esistono riferimenti circolari o meno. Gli ordini di calcolo dei nodi sono definiti prendendo in considerazione le strutture di dipendenza delle cellule coinvolte.

A partire dalla struttura ad albero I / O, puoi usare qualsiasi strumento algoritmo di minimizzazione in Python come vuoi.

Ti suggerisco di dare un'occhiata al link

Cordiali saluti, Gabriel

    
risposta data 28.09.2015 - 13:21
fonte

Leggi altre domande sui tag