2015-11-06 49 views
6

我一直在看榆樹,我非常喜歡學習這門語言。我一直在考慮製作一個電子表格應用程序,但我無法將我的頭腦如何構建。如何在榆樹中構建電子表格應用程序?

假設我們有三個單元格; A,B和C. 如果我在單元格A中輸入4,並在單元格B中輸入=A,我將如何讓單元格B始終等於單元格A?如果我然後在單元格C中輸入=A+B,那麼可以將它評估爲8,並且在A或B更改時也可以更新? 不知道如何槓桿信號的這種動態行爲.. 關心奧斯卡

回答

5

首先,您需要決定如何表示您的電子表格網格。如果你來自C背景,你可能想使用2D數組,但是我發現字典在Elm中實際上效果更好。所以你可以定義type alias Grid a = Dict (Int, Int) a

至於a,每個細胞所擁有的...這是一個定義領域特定語言的機會。因此,像

type Expr = Lit Float | Ref (Int, Int) | Op2 (Float -> Float -> Float) Expr Expr 

這意味着一個表達式可以是一個文字浮動,到另一個小區的位置的引用,或操作者。一個運算符可以是兩個浮點數上的任何函數,還可以是遞歸求值的兩個其他表達式。根據您的目標,您可以爲每個操作定義特定標籤,如Plus Expr Expr | Times Expr Expr,或者您可以爲不同元素的操作(如否定)添加額外的opN標籤。

那麼你可以定義type alias Spreadsheet = Grid Expr,如果你想別名(Int, Int)的東西,這可能也有幫助。我也假設你只想在你的電子表格中使用浮動。

現在您需要將字符串轉換爲表達式並返回的函數。這些功能的傳統名稱是parseeval

parse : String -> Maybe Expr -- Result can also work 
eval : Spreadsheet -> Grid Float 
evalOne : Expr -> Spreadsheet -> Maybe Float 

解析會有點棘手; String module是你的朋友。 Eval將涉及通過電子表格追蹤引用並遞歸地填充結果。起初,你會想忽略捕捉無限循環的可能性。此外,這只是一個草圖,如果您發現不同類型的簽名效果更好,請使用它們。至於視圖,我會從只讀開始,因此您可以驗證硬編碼的電子表格是否已正確評估。然後,您可以擔心編輯問題,因爲您只需重新運行解析器和評估程序,並獲取新的電子表格即可進行渲染。它應該工作,因爲電子表格除了每個單元格的內容之外沒有其他狀態。 (最小化重新計算的工作是可以擴展它的許多不同方法之一。)如果使用elm-html,表格元素應該沒問題。

希望這可以讓你走向正確的方向。這是一個雄心勃勃的計劃,我很樂意在完成後看到它(將其發佈到mailing list)。祝你好運!

+0

謝謝你的回答。期待着嘗試一下。如果我得到一些有用的東西,將確保發佈:) – oskbor