Gostaria de entender como é resolvida uma planilha (um grupo de células nomeadas ou identificadas contendo valores ou fórmulas que referenciam outras células). Tentei analisar os projetos existentes, mas havia muita coisa acontecendo com a GUI, serialização, eventos etc. que não consegui encontrar a planilha.
Na sua forma mais simples, como funciona?
design
algorithms
hildred
fonte
fonte
Respostas:
Em sua essência, uma planilha é uma linguagem funcional com digitação dinâmica e cada função ou valor pode ser referenciado como uma célula na matriz.
Em vez de coisas como
(defn some-name ...)
asome-name
peça é colocada na própria célula.Se você acessar um ide de linguagem funcional com atualização dinâmica (como lighttable para clojure), verá a mesma funcionalidade de uma planilha. Vincule um valor a um nome, escreva uma função que use esse valor, altere o valor e a saída da função muda imediatamente. É o mesmo que fazer algo como escrever
=A1 + B2
no local doC3
excel.Assim, programadores funcionais geralmente gostam de escrever planilhas como programas de brinquedos ... e também o assunto de trabalhos de pesquisa. (Sim, desculpe, todos eles estão por trás de um paywall do ACM.org)
Programação funcional da planilha
Forms / 3: uma linguagem visual de primeira ordem para explorar os limites do paradigma da planilha
Implementando planilhas de funções
O início da planilha na Wikipedia fornece algumas dicas de como implementar uma:
Aproveitando isso a partir do paradigma Outline of Model-View-Controller, conforme expresso nas bibliotecas Java . O autor continua mencionando applets (um pouco datado, foi escrito em 93-96) e menciona sua página da web que vai para http://csis.pace.edu/~bergin/Java/applets.htm (sim , applets) para o código da planilha correspondente http://csis.pace.edu/~bergin/Java/Spreadsheet.java
Apontarei que a totalidade da planilha não é tão grande neste applet 570 linhas, incluindo a documentação.
Dito isto, dependendo do idioma, você provavelmente poderia fazer tudo isso apenas com ponteiros de função em uma matriz esparsa.
fonte
Conceitualmente, cada célula é um nó de um gráfico acíclico direcionado e as referências a outras células criam arestas nesse gráfico. Quando você altera uma célula, uma classificação topológica de todos os nós alcançáveis a partir da célula que você alterou dará a ordem necessária para avaliar as células. Depois de determinar a ordem correta, é apenas a análise de expressão padrão.
fonte
Como já mencionado, uma planilha é facilmente implementada como um DAG (gráfico acíclico direcionado) armazenado em um hash ou dicionário simples. Algum código simples para brincar é provavelmente a maneira mais fácil de entendê-lo:
Uma versão muito simples do Python: http://code.activestate.com/recipes/355045-spreadsheet/
Isso foi explicado e elaborado nesta postagem do blog: http://ralsina.me/weblog/posts/BB585.html
Há também uma versão JavaScript simples com uma GUI aqui: http://jsfiddle.net/ondras/hYfN3/
fonte
Eu codifiquei um pacote python que permite converter a estrutura de células da função objetivo do arquivo do Microsoft Excel em Python. XL2py
Os valores das células são analisados para um objeto do tipo dict () anexa seus valores. Células com referências a outras células por fórmulas compreendem nós. Os nós se referem a uma célula cujo valor é definido por sua fórmula. A partir de cada fórmula de nó, uma estrutura de dependência é definida para definir se as referências circulares existem ou não. As ordens de cálculo dos nós são definidas considerando as estruturas de dependência das células envolvidas.
A partir da estrutura em árvore de E / S, você pode usar qualquer algoritmo de minimização implementado no Python como desejar.
Eu sugiro que você dê uma olhada em https://github.com/gusmaogabriels/XL2py
Atenciosamente, Gabriel
fonte