Wolfram函数库:启动扩展Wolfram语言的开放平台

Wolfram语言使之成为可能

这些天来,我们和沃尔夫拉姆语.就在三周前,我们推出了免费的Wolfram引擎为开发人员帮助人们将Wolfram语言集成到大型软件项目中Wolfram函数库为那些为扩展Wolfram语言而构建的函数提供一个有组织的平台——我们正在为任何人开放函数库。

Wolfram函数库是由于Wolfram语言的独特性质而成为可能的,它不仅是一种编程语言,而且是全尺寸计算语言.在传统编程语言中,添加重要的新功能通常涉及构建整个库,这些库可能一起工作,也可能不一起工作。但是在Wolfram语言中,有语言中已经包含了很多东西仅仅通过引入单个新函数就可以添加重要的功能,这些函数可以立即集成到整个语言的连贯设计中。

为了开始,我们已经有了532功能在Wolfram函数库中,分为26个类别:

Wolfram函数库

就像内置6000多个功能在Wolfram语言中,函数库中的每个函数都有一个文档页面,带有描述和示例:

LogoQRCode

进入页面,点击复制“函数blob”,粘贴到你的输入,然后使用函数就像内置的Wolfram语言函数(所有必要的下载等已经自动处理版本12.0):

ResourceFunction

wolfr ResourceFunction[“LogoQRCode”][”。am / E72W1Chw”,CloudGet [" https://wolfr.am/EcBjBfzw "]]

这里的关键是在介绍LogoQRCode例如,你不必建立一个“处理图像的库”:已经有了一种一致的、精心设计的方法来表示和处理图像使用图像在Wolfram语言中,它立即与该语言中的其他一切相适应:

ImageTransformation

表[ImageTransformation[ResourceFunction[“LogoQRCode”][“wolfr.am/E72W1Chw”,ColorNegate[CloudGet[”https://wolfr.am/EcBjBfzw“]]],#^k&],{k,1,2,25}]

我希望,在他的帮助下令人惊叹的天才社区Wolfram函数库是在Wolfram语言周围发展起来的,在过去的几十年中,Wolfram函数库将允许对该语言可用的(可能非常专业的)函数范围进行快速而显著的扩展。一切都将利用语言的内容和设计原则语言体现了这一点。(当然,Wolfram语言有30多年的设计稳定性历史.)

在函数库中的函数中,可能有一小段Wolfram语言代码,也可能有大量的代码。可能有这样的要求外部api和服务,或其他语言的外部库.但关键是,当涉及到用户级功能时,所有的一切都将配合在一起,因为这都是基于Wolfram语言的一致设计——每个功能都会自动“正常工作”。

我们已经将其设置为尽可能容易地贡献给Wolfram函数库,基本上只需填写一个简单的笔记本. 自动化有助于确保一切都符合我们的设计准则。我们关注的是覆盖范围,而不是深度(尽管我们正在建立一个专家审查程序),我们不坚持任何类似的做法艰苦的设计分析或者我们应用于语言中内置函数的完整性和健壮性的严格标准。

有很多折衷和细节。但我们的目标是优化Wolfram函数库,既为用户提供实用性,又便于贡献。随着它的发展,我毫不怀疑我们将不得不发明新的机制,不仅仅是为了组织大量函数,并找到所需的函数。但这非常令人鼓舞这是一个很好的开始,我自己贡献了许多功能到初始集合。许多都是基于我已经使用了很长时间的代码。我只花了几分钟就将它们提交到了存储库。但现在它们已经在存储库中,我第一次可以随时使用这些函数,而不用担心查找文件、加载包等。

低成本,高回报

甚至在web出现之前,我们就已经有了让人们共享Wolfram语言代码的方法(我们的第一个主要集中努力是MathSource,1991年为Mathematica创建,使用CD-ROM等)。但Wolfram函数库在性质上有所不同,功能更强大。

30多年来,我们一直在努力维护Wolfram语言的设计完整性,这对于使Wolfram语言不仅成为一种编程语言,而且成为一种语言至关重要全面的计算机语言.现在,Wolfram函数库所做的是利用所有这些设计工作来添加新函数,使其始终符合该语言的框架。

在每个函数的实现中,各种各样的事情都会发生。但关键的是,对于用户来说,功能是以一种非常明确和统一的方式呈现的。从某种意义上说,Wolfram语言的内置函数提供了6000多个一致的函数设计示例(以及我们的liverstream设计评审包括几百个小时的设计过程).但更重要的是,最终使Wolfram函数库能够很好地工作的是Wolfram语言的符号特征,以及已经内置在该语言中的所有非常丰富的结构。如果你有一个处理图像的函数稀疏阵列,或分子结构,或地理位置,或者任何语言中已经有一致的符号表示的东西,通过使用它,您的函数可以立即与系统中的其他函数兼容。

建立一个真正工作良好的存储库是一个有趣的元设计问题。如果自由太少,就无法得到想要的功能。给你太多的自由,你就无法保持足够的一致性。我们之前有几个例子都运行得很好。的Wolfram示范项目-于2007年启动,现在(终于)在网上交互式运行,包含超过12,000个贡献的交互式演示。的Wolfram数据存储库有600多个数据集可以立即在Wolfram语言中使用Wolfram神经网络知识库每周增加神经网络(118到目前为止),立即插入NetModelWolfram语言中的函数。

所有这些例子都有一个特点就是被收集的东西是很好的平行的。是的,实际的演示或神经网络的细节可能会有很大的变化,但任何给定存储库的基本结构都是相同的。那么,向Wolfram语言添加扩展的存储库又如何呢?Wolfram语言的设置非常灵活——因此基本上可以以任何方式进行扩展和更改。这对于用Wolfram语言快速构建各种大型系统是非常重要的。但这种灵活性也带来了代价。因为一个人越多地使用它,他就越会以一个独立的功能塔而结束——而一个人就越不能期待(没有巨大的设计努力)自己构建的东西能够始终与其他东西相适应。

在传统编程语言中,库已经存在一个非常普遍的问题。如果您使用一个库,它可能是OK的。但如果你尝试使用几个,并不能保证它们能组合在一起。当然,在传统的编程语言中(相对于完整的计算语言),除了基本的数据结构之外,不期望任何东西具有一致的内置表示,这一点也没有帮助。但问题远不止于此:当一个人构建了一个大型的功能塔时,如果没有我们在Wolfram语言中投入的那种巨大的集中设计努力,他将无法实现所有东西都能很好地一起工作所需的一致性和连贯性。

因此,Wolfram函数库的想法是通过以单个函数的形式添加小型扩展来避免这个问题——以一致的方式进行设计要容易得多。是的,有些事情是不能用单个功能方便地完成的(我们很快将发布一种用于分发大规模包的流线型机制)。但是有了Wolfram语言中已经内置的所有功能,单个函数可以做的事情非常多。我们的想法是,只要稍加努力,就有可能创造出非常有用的功能,保持足够的设计一致性,使它们能够相互配合,易于广泛使用。

当然,这是一种权衡。使用更大规模的包,可以引入一个全新的功能世界,这可能是非常强大和有价值的。但是如果你想要有新的功能来适应其他的一切,那么除非你准备花费巨大的设计努力,它将不得不更小的规模。Wolfram函数库的思想是要达到一个特定的最佳位置,允许添加强大的功能,同时使其易于管理,以保持良好的设计一致性。

向存储库投稿

我们努力使向Wolfram函数库贡献内容变得容易。在桌面上(已经在版本12.0),你可以直接去文件>>库项目>功能存储库项你会得到一个“定义的笔记本“(以编程方式,您还可以使用创建笔记本[" FunctionResource "]):

定义的笔记本

您必须做两件基本的事情:首先,实际给出函数的代码,其次,给出说明该函数应该如何使用的文档。

按下顶部的Open Sample按钮,看看你需要做什么:

PositionLargest

从本质上讲,您正在尝试创建一个类似于Wolfram语言中的内置函数的东西。除了它可以做一些比内置函数更具体的事情。对于它的完整程度和稳健程度的预期也要低得多。

但是,您需要为函数指定一个符合Wolfram Language函数命名原则的名称。您还需要文档遵循与内置函数相同的模式。关于这些我稍后会多说一些。但是现在,请注意在Definition Notebook的一排按钮中有一个风格指南按钮,它解释了更多的操作,还有一个工具按钮,它提供了专门用于格式化文档的工具。

当你认为你准备好了,按下检查按钮。如果你还没有得到所有的细节也没关系。因为Check会自动进行很多风格和一致性的检查。通常它会立即提出建议让你批准(“这一行应该以冒号结束”,它会提出把冒号放进去)。有时它会要求你自己添加或改变一些东西。我们将不断地添加Check的自动功能,但基本上它的目标是尝试确保你提交到Function Repository的任何东西都已经被保证遵循尽可能多的风格指南。

检查评论

好的,在运行“检查”后,您可以使用“预览”。预览将生成您为功能定义的文档页面的预览。您可以选择在桌面笔记本或云中创建预览。如果您不喜欢预览中看到的内容,请返回并修复它,然后再次按“预览”。

现在可以部署函数了。Deploy按钮提供四个选项:

部署

您可以做的最重要的事情是将您的函数提交到Wolfram函数库,这样每个人都可以永远使用它。但您也可以将函数部署到更受限制的用途。例如,您可以将该函数部署在本地计算机上,因此无论何时使用该计算机,它都是可用的。或者你可以把它部署到你的云账户,所以只要你连接到云,它就可以使用。您还可以通过您的云帐户公开部署功能。它不会在Wolfram功能库的中央,但你可以给任何人一个URL,让他们从你的帐户获得你的功能。(在未来,我们还将支持组织范围的中央存储库。)

好的,假设您已经准备好将您的函数提交到Wolfram函数库。然后,不用说,您按submit to Repository。那么接下来会发生什么?好的,您的提交立即进入队列,等待我们的策展人团队的审核和批准。

在提交过程中(通常需要几天时间),你会收到状态信息——可能还有建议。但是一旦您的函数获得批准,它就会立即在Wolfram函数库中发布,供任何人使用。(它会出现在新功能摘要等等,等等)。

存储库中应该有什么

在过去30多年里,我们煞费苦心地在Wolfram语言中构建了6000多个功能,在完整性、健壮性和总体质量方面,我们有非常高的标准。Wolfram函数库的目标是利用Wolfram语言中已经存在的所有结构和功能来添加尽可能多的、更轻量级的函数。

是的,Wolfram函数存储库中的函数需要遵循Wolfram语言的设计原则—这样它们才能与其他函数相适应,并符合用户对函数如何工作的期望。但是它们不需要具有相同的完整性或健壮性。

在Wolfram语言的内置函数中,我们努力使事情尽可能通用。但是在Wolfram函数库中,拥有一个只处理一些非常特定但有用的情况的函数没有什么错。SendMailFromNotebook可以接受一种特定格式的笔记本,并以一种特定方式生成邮件。PolygonalDiagram仅使用特定的颜色和标签制作图表。等等。

关于内建函数的另一件事是,我们煞费苦心地处理所有的边角情况,正确地处理错误的输入,等等。在函数库中,有一个只处理主要情况而忽略其他所有情况的函数是可以的。

显然,最好是有功能更多的函数,做得更好。但是,与Wolfram language的内置函数不同,函数库的优化是拥有更多的函数,涵盖更多的功能,而不是加深每个函数。

如何测试功能存储库中的功能?对内置功能的期望要低得多。但是—特别是当函数依赖于外部资源(如api)时—持续运行回归测试是很重要的,这是在后台自动发生的事情。在定义笔记本中,您可以显式地给出(在附加信息部分中)任意数量的测试,可以通过输入和输出行或完整符号定义VerificationTest对象。此外,系统尝试将您提供的文档示例转换为测试(尽管这有时非常棘手,例如,对于结果取决于随机数或时间的函数)。

在函数库中,函数的实现将会非常复杂。有些只是一行代码;另一些可能涉及数千或数万行,可能分散在许多辅助函数上。什么时候值得添加一个只需要很少代码就可以定义的函数?基本上,如果有函数的好名字如果人们在一段代码中看到它,他们就会很容易地理解——那就值得添加它。否则,在每次需要使用代码时重新编写代码可能会更好。

函数库(顾名思义)的主要目的是引入新函数。如果你想引入新数据,或者新实体,然后使用Wolfram数据存储库.但是如果你想引入新的计算对象呢?

实际上有两种情况。你可能想要在函数库的新函数中使用一种新的对象。在这种情况下,你总是可以写下它的符号表示,并在函数库中函数的输入或输出中使用它。

但是,如果您想引入一个对象,然后定义Wolfram语言中现有的函数应该如何对其进行操作,该怎么办呢?Wolfram语言一直有一个简单的机制,叫做upvalues.并且有一定的限制(特别是对于那些不要评价他们的论点),函数存储库让您只需引入函数,并为其定义upvalues。(设定期望值:在Wolfram语言中,在任何地方都充分集成一个主要的新构造通常是一项非常重要的任务,这不可能仅仅通过upvalues来实现,这是我们作为语言长期开发的一部分所做的事情,但并不是建立函数库所要处理的。)

但是,好的,那么函数库中函数的代码中可以包含什么呢?任何内置在Wolfram语言中的东西,当然(至少只要它不构成安全风险).还有函数库中的任何函数。但也有其他的可能性。函数库中的函数可以调用APIWolfram云在别处.当然,这是有风险的。因为无法保证API不会发生变化——并使函数库中的函数停止工作。要认识到这类问题,文档页面(在Requirements下)总是会有一个注释,说明任何函数不仅仅依赖于内置的Wolfram语言功能。(当然,当涉及到真实世界的数据时,即使使用这个功能也可能会出现问题——因为现实世界中的实际数据是变化的,甚至有时会改变其定义。)

Wolfram函数库的所有代码都必须用Wolfram语言编写吗?外部API中的代码当然不必如此。实际上,本地代码也不会。事实上,如果您在几乎任何外部语言或库中发现一个函数,您应该能够制作一个包装器,允许它在Wolfram函数库中使用。(通常这将涉及使用ExternalEvaluateExternalFunction在Wolfram语言代码。)

那么这样做的意义是什么?基本上,它是利用整个集成的Wolfram语言系统和它的统一设计。您可以从外部库或语言获得底层实现,但随后您将使用Wolfram语言丰富的符号结构来创建一个方便的顶级函数,使人们能够轻松使用已实现的任何功能。而且,至少在一个完美的世界里,装载库等所有细节都将通过Wolfram语言自动处理。(在实践中,有时会出现问题设置外部语言在特定的计算机系统上,以及在云计算中,还有额外的安全问题需要担心。)

顺便说一下,当您第一次看到典型的外部库时,它们通常看起来过于复杂,不可能仅由几个函数来覆盖。但在很多情况下,大部分的复杂性来自于构建库所需的基础设施——以及支持它的所有功能。然而,在使用Wolfram语言时,基础设施通常已经内置,因此不需要公开所有这些支持函数——只需要为库中少数“最顶层”的面向应用程序的函数创建函数。

存储库的生态系统

如果您编写了一直使用的函数,那么将它们发送到Wolfram函数库!如果没有其他功能,您自己使用这些函数会容易得多。当然,如果你一直使用这些函数,其他人也会发现它们很有用。

当然,您可能处于不能或不想共享函数的情况下,或者它们访问私有资源。在这种情况下,你可以把这些功能部署到你自己的云账户上,设置权限谁能接触到它们。(如果你的组织有Wolfram企业私有云,那么它将很快能够托管自己的私有功能存储库,该存储库可以在您的组织内进行管理,并设置为强制审阅提交,或者不强制审阅。)

你提交到Wolfram函数库的函数不必是完美的;它们必须是有用的。与经典Unix文档中的“bug”部分类似,在定义笔记本中有一个称为“作者笔记”的部分,您可以在其中描述您已经意识到的关于您的函数的局限性、问题等。此外,当你提交你的功能,你可以包括提交说明,将由管理团队阅读。

一旦一个函数被发布,它的文档页面的底部总是有两个链接:发送关于此功能的消息“、和”在Wolfram社区讨论”. 如果您发送了一条消息(比如报告了一个bug),您可以选中一个框,表示希望将您的消息和联系信息传递给函数的作者。

通常,您只希望使用来自Wolfram函数库的函数,就像内置函数一样,而不需要查看它们的内部。但如果你想“查看内部”,顶部总有一个Source Notebook按钮。按下它,你就会得到提交到功能库的原始定义笔记本。有时候你可能只是想看看这个例子。但您也可以自己进行修改。也许你想在你的电脑或你的云帐户上部署这些。或者,您可能希望将这些函数提交到函数库(Function Repository),将其作为原始函数的更好版本。

将来,我们可能会在函数库中支持Git风格的分叉。但是现在,我们保持它的简单性,并且我们总是只拥有每个函数的一个规范版本。基本上(除非他们放弃它,不响应消息),函数的原始作者可以控制对它的更新,并可以提交新版本,然后对其进行审查,如果获得批准,则发布。

好的,那么版本控制是如何工作的呢?现在,只要您使用函数库中的函数,它的定义就会永久存储在您的计算机上(或者如果您使用云,则存储在您的云帐户中)。如果有新版本的函数,那么当您下次使用该函数时,您将收到一条消息,告知您这一点。如果您想更新到新版本,您可以使用ResourceUpdate(“函数blob”实际上存储了更多关于版本控制的信息,将来我们计划使其易于访问。)

关于Wolfram函数库的一个伟大的事情是,任何地方的Wolfram语言程序都可以使用它的函数。如果程序出现在笔记本中,通常最好将函数库函数格式化为易于阅读的“函数团”(可能需要适当的版本设置)。

但您总是可以使用文本引用任何函数库函数ResourceFunction[...].如果你直接为Wolfram引擎编写代码或脚本,这是很方便的一个IDE或文本代码编辑器(是的,函数库与免费的Wolfram引擎为开发人员.)

它是如何工作的

在Wolfram函数库中,它使用的是完全相同的资源系统框架作为我们所有的其他存储库数据存储库神经网络库示范项目就像资源系统中的其他内容一样ResourceFunction最终是基于一个ResourceObject

这是一个ResourceFunction

ResourceFunction

ResourceFunction(“StringIntersectingQ”)

里面有点复杂,但是你可以看到它的一些用途信息

信息

[" StringIntersectingQ "]] [ResourceFunction信息

那么,设置资源函数是如何工作的呢?最简单的是纯粹的局部情况。下面是一个示例,它接受一个函数(这里只是一个纯函数),并将其定义为此会话的资源函数:

DefineResourceFunction

DefineResourceFunction[1+#&,“AddOne”]

一旦你定义好了,你就可以使用resource函数了:

ResourceFunction

ResourceFunction[“AddOne”][100]

请注意,在这个函数blob中,有一个黑色图标.这表明函数blob引用为当前会话定义的内存中资源函数。对于永久存储在您的计算机或云帐户中的资源功能,有一个灰色图标. 对于Wolfram函数库中的官方资源函数,有一个橙色图标

好的,那么当您在定义笔记本中使用Deploy菜单时会发生什么呢?首先,它将获取定义笔记本中的所有内容并生成一个符号ResourceObject出来。(如果您正在使用文本ide或程序,您还可以显式创建ResourceObject.)

在您的计算机上本地部署使用LocalCache将其存储为LocalObject在您的文件系统中。在您的云帐户中部署使用CloudDeploy在资源对象上,并在云中公开部署使用云发布.在所有情况下,资源寄存器还用于注册资源函数的名称,以便ResourceFunction["名称”)将工作。

如果您按SubmittoFunctionRepository,那么下面发生的是ResourceSubmit正在资源对象上调用。(如果使用文本接口,则可以调用ResourceSubmit直接)。

默认情况下,提交的名称与您的Wolfram ID关联。但是,如果您代表一个组或组织提交,那么您可以设置单独的发布者ID,您可以改为使用此名称与提交内容关联。

一旦您向功能存储库提交了内容,它将进入队列进行审阅。如果您收到评论,它们通常会以笔记本的形式添加额外的“评论单元格”。您可以通过访问资源系统贡献者门户.但是一旦它被批准,您将收到通知(通过电子邮件),并且您的提交将在Wolfram函数库中实时显示。

一些微妙之处

乍一看,似乎可以把定义笔记本一字不移地放到函数库中。但实际上有很多微妙之处——处理它们需要进行一些相当复杂的元编程,象征性地处理定义函数的代码和Definition Notebook本身。其中大部分都是在内部,在幕后进行的。但是如果你打算为函数库做贡献的话,它的一些后果是值得理解的。

这里有一个直接的微妙之处。当你填写定义笔记本时,你可以在任何地方用一个名字来引用你的函数,比如MyFunction-这看起来像Wolfram语言中函数的普通名称ResourceFunction[“MyFunction”]-这是用户实际使用的。

这里还有一个微妙之处:当您从Definition Notebook创建资源函数时,需要捕获并显式地包含函数定义中涉及的所有依赖项。为了保证定义保持模块化,我们需要把所有东西都放在一个独特的位置名称空间(不用说做这些的函数在函数存储库中。)

通常,您不会看到任何用于设置该名称空间的内部上下文的证据。但是,如果出于某种原因,您从函数内部返回一个未求值的符号,那么您将看到该符号处于内部上下文中。但是,在处理Definition Notebook时,至少对应于函数本身的符号是设置,以优雅地展示作为函数blob,而不是内部上下文中的原始符号。

函数库是关于定义新函数的。这些函数可以有选择。通常这些选项是这样的(比如,方法图像大小),它们已经用于内置函数,并且内置符号已经存在。但有时一个新的功能可能需要新的选项。为了保持模块化,人们可能希望这些选项是在一个独特的内部上下文中定义的符号(或者是类似于整个资源函数的东西)。但为了简单起见,Function Repository允许在定义中以字符串的形式给出新的选项。并且,作为对最终用户的礼貌,这些定义(假设他们已经使用过用OptionValue选项模式)也会处理,以便在使用函数时,选项不仅可以作为字符串提供,还可以作为具有相同名称的全局符号提供。

大多数函数只是执行每次调用时所执行的操作。但是有些函数在特定会话中运行之前需要初始化,为了处理这个问题,在定义笔记本中有一个初始化部分。

函数存储库中的函数可以立即使用存储库中已经存在的其他函数。但是,如果函数库包含两个(或更多)相互引用的函数,该如何设置函数库的定义呢?基本上你只需要在你的会话中部署它们,所以你可以引用它们为ResourceFunction["名称”)。然后您可以创建所需的示例,然后提交函数。

当存储库变大时会发生什么?

今天,我们刚刚启动了Wolfram函数库。但随着时间的推移,我们预计它会急剧增长,随着它的增长,我们知道会出现各种各样的问题。

第一个是函数名及其唯一性。函数库的设计与Wolfram语言中的内置函数类似,人们可以通过给出函数名来引用任何给定的函数。但这不可避免地意味着函数名在整个存储库中必须是全局唯一的——例如,只能有一个函数名ResourceFunction[" MyFavoriteFunction "]在存储库中。

这似乎是一个大问题。但值得一提的是,这与互联网域名或社交网络句柄等问题基本相同。关键是,我们只需要有一个注册器,这是Wolfram函数库所扮演的角色之一。(对于存储库的私有版本,其管理员可以是注册者。)当然,可以注册internet域,但在函数存储库中,只有在有实际函数定义的情况下才能注册函数名。

我们管理Wolfram函数库的部分职责是确保为函数选择的名称在给定函数定义的情况下是合理的,并且符合Wolfram语言命名约定。我们现在已经有30多年用Wolfram语言命名内置函数的经验,我们的策展团队将这种经验带到函数库中。当然,总会有权衡。例如,为某个函数使用一个短名称似乎很好。但最好用一个更长、更具体的名字来“防御性地命名”,因为这样一来,它就不太可能与将来想做的事情发生冲突。

(顺便说一句,仅仅添加某种类型的贡献者标记来消除函数的歧义不会有多大效果。因为除非坚持始终提供标记,否则最终将不得不为任何给定函数定义默认标记。哦,再次分配贡献者标记需要全局协调。)

随着Wolfram函数库的增长,肯定会出现的一个问题是函数的可发现性。是的,有搜索功能(定义笔记本可以包括关键字等)。但是对于Wolfram语言中的内置函数,文档中有各种各样的交叉链接,有助于“宣传”函数。函数库中的函数可以链接到内置函数。但反过来呢?我们将试验各种方案,在内置函数的文档页面上公开函数库函数。

对于Wolfram语言中的内置函数,还提供了一定程度的可发现性“指南页”网络它提供了与特定领域相关的有组织的功能列表。适当地平衡指南页面总是很复杂——随着Wolfram语言的发展,指南页面通常需要完全重构。将函数库中的函数放入宽泛的类别中,甚至依次分解这些类别是相当容易的。但组织得当的指南页面更有价值。目前还不清楚如何最好地为整个函数库生成这些。但是例如CreateResourceObjectGallery在函数库中,任何人都可以把自己的“选择”放在一个网页上:

资源画廊

Wolfram函数存储库被设置为一个永久的函数存储库,其中的任何函数都可以正常工作。当然,函数可能会有新的版本。我们完全预料到一些函数会随着时间的推移而被淘汰。如果在程序中使用这些函数,它们仍然可以工作。但它们的文档页面将指向新的、更好的功能。

Wolfram函数库主要是关于快速提供新函数,并探索如何使用Wolfram语言的新领域。但是我们完全期望函数库中探索的一些内容最终会成为核心Wolfram语言的内置部分。在过去的十年里,我们也有类似的流动最初在Wolfram | Alpha中引入的功能. 其中一个教训是,要达到我们对Wolfram语言中内置的任何东西所坚持的质量和一致性标准,需要做大量的工作,这通常会使最初的实现工作相形见绌。但即便如此,函数库中的函数可以作为Wolfram语言中构建的未来函数的非常有用的概念证明。

当然,关键的是,功能库中的功能现在可以供所有人使用。是的,最终的内置功能可能会更好、更强。但功能库让人们能够立即访问新功能。而且,至关重要的是,它让这些新功能变得更加有用任何人都会怀疑。

在早期的Wolfram语言的历史中,这并不能很好地工作。但是现在这门语言已经内置了很多东西,而且对这门语言的设计原则也有了很强的理解,所以让一大群人加入一些功能来保持设计的一致性,使它们更广泛地使用是可行的。

在Wolfram语言用户社区中有令人难以置信的天才。(当然,这个圈子里有许多世界上各个领域的顶级研发人员。)我希望Wolfram函数库将提供一个有效的平台,让这些人才得以公开和共享。这样我们就能创造出一些东西来极大地扩展计算范式可以应用的领域。

在30多年的时间里,我们已经在Wolfram语言方面取得了长足的进步。现在,让我们一起更进一步。让我们使用函数库以及开发人员的免费Wolfram引擎作为实现这一点的平台。

Baidu