Answers:
电子表格的核心是一种具有动态类型的功能语言,每个功能或值都可以引用为矩阵中的单元格。
而不是(defn some-name ...)
将some-name
零件放置在单元格中。
如果您使用动态更新的功能语言(例如,clojure的lighttable),则会看到与电子表格大致相同的功能。将值绑定到名称,编写一个使用该值的函数,更改该值,该函数的输出立即更改。这=A1 + B2
与C3
在excel 中的位置进行写操作一样。
因此,函数式程序员经常喜欢将电子表格编写为玩具程序……而且也是研究论文的主题。(是的,很抱歉,它们全都位于ACM.org付费墙后面)
函数式编程社区已经对电子表格表现出了一定的兴趣,但是令人惊讶的是,似乎没有人考虑过使用Excel之类的标准电子表格与Haskell这样的标准函数式编程语言一起工作。在本文中,我们展示了一种可以做到这一点的方法。我们希望这样可以使电子表格程序员尝试功能编程。
尽管函数式编程的批评者有时声称对于大多数程序员来说,函数式编程太难了或违反直觉,但大多数人都无法理解和使用它们,但是通过查看电子表格的流行程度,可以找到相反的证据。电子表格范例是功能编程范例的一阶子集,在程序员和最终用户中都得到了广泛的认可。但是,大多数电子表格系统仍有许多限制。在本文中,我们讨论了语言特征,这些特征消除了这些限制中的几个限制,而不偏离一阶声明式评估模型。
电子表格可以完成大量的最终用户开发。电子表格隐喻很吸引人,因为它是可视的并且可以进行交互式实验,但是正如Peyton Jones,Blackwell和Burnett所观察到的那样,电子表格隐喻甚至不接受最基本的抽象:将表达式转换为命名函数。因此,他们提出了一种使用具有指定输入和输出单元的工作表定义函数的方法。我们将其称为功能表。
Wikipedia上Spreadsheet的开头提供了一些有关如何实现的提示:
电子表格是一种交互式计算机应用程序,用于以表格形式组织和分析数据。电子表格是作为纸质会计工作表的计算机模拟而开发的。该程序对表示为数组单元的数据进行操作,并按行和列进行组织。数组的每个单元格都是一个模型-视图-控制器元素,可以包含数字或文本数据,也可以是基于其他单元格的内容自动计算和显示值的公式的结果。
基于Java库中表示的Model-View-Controller范例纲要在此基础上构建。作者继续提到applet(有点过时,写在'93 -'96中),并提到了他的网页,该网页转到http://csis.pace.edu/~bergin/Java/applets.htm(是,小程序)对应的电子表格代码http://csis.pace.edu/~bergin/Java/Spreadsheet.java
我要指出的是,在此applet 570行(包括文档)中,电子表格的整体并不大。
就是说,根据语言的不同,您可以只使用稀疏数组中的函数指针来完成所有操作。
从概念上讲,每个单元格都是有向无环图的节点,对其他单元格的引用会在该图中创建边。更改单元时,对更改后的单元可访问的所有节点的拓扑排序将为您提供评估单元所需的顺序。一旦确定了正确的顺序,它就是标准表达式解析。
如前所述,电子表格很容易实现为存储在简单哈希或字典中的DAG(有向无环图)。一些简单的代码可能是理解它的最简单方法:
一个非常简单的Python版本:http : //code.activestate.com/recipes/355045-spreadsheet/
在此博客文章中对此进行了解释和阐述:http : //ralsina.me/weblog/posts/BB585.html
这里还有一个带有GUI的简单JavaScript版本:http : //jsfiddle.net/ondras/hYfN3/
我已经编码了一个python包,该包允许您将MS Excel文件目标函数单元格结构转换为Python。XL2py
单元格值被解析为dict()类型的对象,并将其值附加到对象上。通过公式引用其他单元格的单元格包含节点。节点引用其值由其公式定义的单元格。根据每个节点公式,定义了一个依赖关系结构,以定义是否存在循环引用。通过考虑所涉及的单元依赖性结构来定义节点计算顺序。
从I / O树结构开始,您可以随意使用Python中的任何最小化算法实现。
我建议您看看https://github.com/gusmaogabriels/XL2py
最好的问候,加百利