2015-11-06 80 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