【CSDN 编者按】有点雷人,Excel 不仅仅是办公软件,还是编程语言……言归正传,Excel 作为编程语言还存在一些不足。为了弥补这些缺陷,Excel 团队与微软剑桥研究院建立了长期合作关系。好消息接连传来……作者 | Andy Gordon 译者 | 弯月
出品 | CSDN(ID:CSDNnews)
微软的 Excel 几乎是家喻户晓的办公软件,它也是世界上使用最广泛的编程语言。编写 Excel 公式的用户甚至超过了 C、C 、C#、Java 和 Python 程序员的总和。尽管 Excel 取得了巨大的成功,但作为一种编程语言它仍然有一些基本的弱点,其中最突出的两大弱点是:
Excel 公式语言实际上仅支持标量值,即数字、字符串和布尔值;
不允许用户定义新函数。
为了解决这两个问题,微软剑桥研究院与 Excel 团队建立了长期合作关系,致力于将电子表格公式转换为成熟的编程语言。二者合作的成果逐步出现在产品中。在 2019 年 ACM SIGPLAN 编程语言原理研讨会(POPL 2019)上,微软宣布了两项重大进展:Excel 的数据类型不再限于文本和数字,允许单元格包含原生记录类型,包括链接到外部数据的实体以及动态数组(允许普通公式计算整个数组,结果溢出到相邻单元格中)等。这些变化都是为了解决第一个问题,即在 Excel 中建立丰富的、完整的、原生的结构化数据。
2020 年 12 月,微软发布了 LAMBDA,允许用户通过 Excel 的公式语言编写新函数,这可以直接解决第二个问题。这些新定义的函数可以调用其他的 LAMBDA 函数,深度不限,甚至可以递归。有了 LAMBDA 后,Excel 已具备图灵完备性。理论上来说,你可以使用 Excel 公式语言编写任何计算。现在,加入 Insiders:Beta 计划的用户已经可以使用 LAMBDA 了。在 2021 年的 POPL 大会上,微软的视频中讨论了 LAMBDA 以及电子表格的一些研究。
LAMBDA 的功能
研究人员都知道自 1960 年代以来,邱奇的 lambda 表示是很多编程语言的基础,因此,它本身就是一种富有表现力的编程结构。融合 lambda 为 Excel 带来了一次从量变到质变的提升。
为了说明 LAMBDA 强大的功能,下面我们使用这种表示法编写一个函数,计算直角三角形的斜边长:
=LAMBDA( X, Y, SQRT( X*X Y*Y ) )
LAMBDA 是 2020 年 3 月发布的 LET 的补充,因此,这个示例也可以写成下面这样:
=LAMBDA( X, Y, LET( XS, X*X, YS, Y*Y,SQRT( XS YS ) ) )
这个函数有两个参数:X 和 Y。函数的功能是将 X*X 的值绑定到 XS 中,Y*Y 的值绑定到 YS,结果返回 SQRT(XS YS )。
我们可以利用 Excel 中已有的命名管理器,为这个公式命名。如果我们为该函数取名 PYTHAGORAS,则 PYTHAGORAS(3,4)的结果就等于 5。在完成命名后,你可以通过函数名调用函数,因此也就不需要重复整个公式了。
而且,LAMBDA 就是那个我们熟知且喜爱的lambda:lambda 可以是另一个lambda 的参数或者结果;你可以定义邱奇数;lambda 可以返回 lambda,所以也可以实现柯里化;使用 LAMBDA 定义不动点组合子,进而编写递归函数;等等。(此外,lambda 也可以拥有函数名,因此它们可以直接递归调用自己,这比使用不动点组合子要方便得多。)
递归调用:反转字符串和不动点组合子
反转字符串不属于 Excel 的内置功能,以前只能使用 Visual Basic 或 JavaScript 等语言编写。在下图中,REVERSE 是一个递归 LAMBDA,它使用一对辅助函数 HEAD 和 TAIL,分别获取第一个字符以及除第一个字符以外的所有字符。
即便不依靠递归定义的名称,Excel 的公式语言也是图灵完备的,因为我们可以使用传统的按值调用不动点组合子,对递归函数定义进行编码。实际上,在 Excel 代码库中,运行这种组合子也是 LAMBDA 早期的压力测试之一。下图定义了一个阶乘函数。
下一步的计划
我们还有很多计划。近期内即将发布的还有可嵌套的数组,以及更有效的处理数组的组合子,比如 MAP 和 REDUCE,这些组合子可以将lambda函数作为参数。除此之外,我们还希望不仅可以通过公式来定义函数,而且还可以利用整个工作表来定义函数,即所谓的工作表定义函数,甚至是弹性工作表定义函数。实际上,工作表定义的函数遵循的是常见的电子表格设计,用户可以通过分布在多个单元格上的多个公式来定义更大的函数。
社区的回应
只有当用户能够轻松、有效地使用某种编程语言,才能说这种语言取得了成功。有些人可能认为 LAMBDA 只适合编程语言爱好者,但对于最终用户来说太难了。在发布 LAMBDA 时,微软发动了一场全球规模的实验,看看最终用户是否能够适应高阶函数的编程。
最初得到的一些反馈很鼓舞人心。12 月,在 LAMBDA 发布的 24 小时内,我们收到了很多的视频,包括将数据拆分成多列和使用 LAMBDA 和 LET 来创建单个单元格报告的视频,还有一些博客帖子,包括计算轴刻度等,社区提供了很多我们从未想到的应用 LAMBDA 的方式。
此外,虽然编写 lambda 需要专业的技能和知识,但调用 lambda 并不需要高端的技术。技术人员可以利用 LAMBDA 扩展 Excel,编写特定于应用程序的函数,而他们的同事则可以直接在 Excel 中调用这些函数。
我们期待,用户进行各种实验,不仅是 LAMBDA,还有数据类型和动态数组。我们相信这些新的函数式编程功能将改变人们使用 Excel 做决策的方式。
参考链接:https://www.microsoft.com/en-us/research/blog/lambda-the-ultimatae-excel-worksheet-function/
,