web-dev-qa-db-ja.com

スプレッドシートの背後にあるデータ構造は何ですか?

スプレッドシート(​​他のセルを参照する値または数式を含む、名前の付いた、または別の方法で識別されたセルのグループ)がどのように解決されるかを理解したいと思います。既存のプロジェクトを調べてみましたが、GUI、シリアル化、イベントなどの処理が多すぎて、スプレッドシートを見つけることができませんでした。

最も単純に、それはどのように機能しますか?

41
hildred

基本的に、スプレッドシートは動的型付けを備えた関数型言語であり、各関数または値はマトリックス内のセルとして参照できます。

(defn some-name ...)などの代わりに、some-nameパーツがセル自体に配置されます。

動的に更新される関数型言語ide(clojureのlighttableなど)にアクセスすると、スプレッドシートと同じ機能の多くが表示されます。値を名前にバインドし、その値を使用する関数を記述し、値を変更すると、関数の出力がすぐに変更されます。これは、Excelで=A1 + B2の場所にC3を書き込むようなものです。

したがって、関数型プログラマーは、スプレッドシートをおもちゃのプログラムとして書くことを好むことが多く、研究論文の主題でもあります。 (はい、申し訳ありません。すべてACM.orgペイウォールの背後にあります)

  • スプレッドシート関数型プログラミング

    関数型プログラミングコミュニティはスプレッドシートにある程度の関心を示していますが、驚くべきことに、Excelなどの標準のスプレッドシートをHaskellなどの標準の関数型プログラミング言語で動作させることを検討した人はいないようです。このペーパーでは、これを行う方法の1つを示します。そうすることで、スプレッドシートプログラマーに関数型プログラミングを試してもらうことを期待しています。

  • フォーム/ 3:スプレッドシートパラダイムの境界を探索するための1次視覚言語

    関数型プログラミングの批判者は、関数型プログラミングはほとんどのプログラマが理解して使用するには難しすぎる、または直感に反すると主張することがありますが、スプレッドシートの人気を見ると、それとは反対の証拠を見つけることができます。関数型プログラミングパラダイムの1次サブセットであるスプレッドシートパラダイムは、プログラマーとエンドユーザーの両方に広く受け入れられています。それでも、ほとんどのスプレッドシートシステムには多くの制限があります。このホワイトペーパーでは、1次の宣言型評価モデルから逸脱することなく、これらの制限のいくつかを解消する言語機能について説明します。

  • 関数スプレッドシートの実装

    スプレッドシートを使用して大量のエンドユーザー開発が行われます。スプレッドシートのメタファーは視覚的でインタラクティブな実験に対応できるため魅力的ですが、ペイトンジョーンズ、ブラックウェル、バーネットによって観察されたように、スプレッドシートのメタファーは最も基本的な抽象化、つまり式を名前付き関数に変換することさえ認めていません。したがって、指定された入力セルと出力セルを持つワークシートの観点から関数を定義する方法を提案しました。これを関数シートと呼びます。


Spreadsheet at Wikipedia の始まりは、それを実装する方法についていくつかのヒントを与えます:

スプレッドシートは、表形式でデータを整理および分析するためのインタラクティブなコンピューターアプリケーションプログラムです。スプレッドシートは、紙の会計ワークシートのコンピュータ化されたシミュレーションとして開発されました。プログラムは、行と列に編成された配列のセルとして表されるデータを操作します。配列の各セルは、数値またはテキストデータ、または他のセルの内容に基づいて値を自動的に計算して表示する数式の結果を含むことができるモデルビューコントローラー要素です。

これに基づいて Javaライブラリ で表現されているModel-View-Controllerパラダイムの概要)。作者はアプレットについて言及します(日付が少しありますが、 '93 -'96)および対応するスプレッドシートコードの http://csis.pace.edu/~bergin/Java/applets.htm (yes、applets)に移動する彼のWebページについて言及している http://csis.pace.edu/~bergin/Java/Spreadsheet.Java

スプレッドシート全体は、ドキュメントを含むこのアプレット570行ではそれほど大きくないことを指摘しておきます。

とはいえ、言語によっては、スパース配列の関数ポインターだけですべて実行できるでしょう。

22
user40980

概念的には、各セルは 有向非循環グラフ のノードであり、他のセルへの参照はそのグラフにエッジを作成します。セルを変更するとき、変更したセルから到達可能なすべてのノードの トポロジカルソート は、セルを評価するために必要な順序を提供します。正しい順序を決定したら、それは単なる標準の式解析です。

34
Karl Bielefeldt

すでに述べたように、スプレッドシートは、単純なハッシュまたは辞書に格納されたDAG(有向非循環グラフ)として簡単に実装できます。簡単なコードを試してみると、おそらくそれを理解する最も簡単な方法です。

非常に単純なPython version: http://code.activestate.com/recipes/355045-spreadsheet/

これはこのブログ投稿で説明され、詳しく説明されています: http://ralsina.me/weblog/posts/BB585.html

ここにGUIを備えた単純なJavaScriptバージョンもあります。 http://jsfiddle.net/ondras/hYfN3/

7
Tom

pythonパッケージをコーディングして、MS Excelファイルの目的関数のセル構造をPythonに変換できるようにしました。XL2py

セルの値はdict()タイプのオブジェクトに解析され、値が追加されます。数式によって他のセルを参照するセルはノードを構成します。ノードは、その式によって値が定義されるセルを参照します。各ノード式から、循環参照が存在するかどうかを定義するために、依存関係構造が定義されます。 Node計算順序は、関連するセルの依存構造を考慮して定義されます。

I/Oツリー構造の時点で、Pythonに実装されている任意の最小化アルゴリズムを自由に使用できます。

https://github.com/gusmaogabriels/XL2py をご覧になることをお勧めします

よろしく、ガブリエル

0