Wolfram Function Repository:Wolfram 语言扩展的开放访问平台

你好,哈布尔! 我向您展示 Stephen Wolfram 帖子的翻译 “Wolfram 函数存储库:推出扩展 Wolfram 语言的开放平台”.

Wolfram Function Repository:Wolfram 语言扩展的开放访问平台

Wolfram 语言一致性的先决条件

今天我们与编程语言一起站在了伟大成就的门槛上 Wolfram语言。 就在三周前,我们推出了 为开发者提供免费的 Wolfram 引擎帮助我们的用户将 Wolfram 语言集成到他们的大型软件项目中。 今天我们推出 Wolfram 函数存储库,为了为扩展 Wolfram 语言而创建的功能提供一个协调的平台,我们还为任何可以为我们的软件产品的开发做出贡献的人开放一个功能存储库。

Wolfram 函数存储库是由于 Wolfram 语言的独特性质而成为可能,它不仅作为一种编程语言,而且作为一种 全面的计算语言。 在传统的编程语言中,添加重要的新功能通常涉及创建整个附加库,这些库一起使用时可能会也可能不会工作。 然而,在 Wolfram 语言中 语言本身已经内置了很多内容,可以通过简单地添加立即集成到整个语言的整体结构中的新函数来显着扩展其功能。

例如,Wolfram 函数存储库已包含 532 个新功能 分为 26 个主题类别:

Wolfram Function Repository:Wolfram 语言扩展的开放访问平台

同样超过 6000个标准功能,内置于 Wolfram 语言中,存储库中的每个函数都有一个文档页面,其中包含它们的详细描述和工作示​​例:

Wolfram Function Repository:Wolfram 语言扩展的开放访问平台

要访问该页面,请复制上述对象(函数 BLOB),将其粘贴到输入行中,然后运行该函数 - 它已内置于 Wolfram 语言中,并且默认支持从 版本12.0:

Wolfram Function Repository:Wolfram 语言扩展的开放访问平台

这里需要注意的是,处理时 标志二维码 例如,您不需要设置“图像处理库” - 因为我们已经在 Wolfram 语言中实现了一致且仔细的算法方式 图像处理,可以立即被各种图形语言函数处理:

Wolfram Function Repository:Wolfram 语言扩展的开放访问平台

希望在大家的支持下 精彩而才华横溢的社区,在过去的几十年里一直在发展和扩展(基于 Wolfram 语言)。 Wolfram 函数存储库将在可预见的未来显着扩展该语言中可用函数的范围(可能具有潜在意义,专门针对科学技术的各个领域)。 因此,可以同时使用语言的内容(其内置函数)和 发展原则,它们是基于语言实现的。 (这里应该指出的是,Wolfram 语言已经有超过 30年发展历程,稳定增长).
存储库中的函数可能包含用 Wolfram 语言编写的小段或大段代码。 例如,这些可能是调用 外部 API 和服务或其他语言的外部库。 这种方法的独特之处在于,当您深入到用户级功能时,不会出现潜在的不一致,因为该方法建立在 Wolfram 语言的一致结构之上 - 并且每个函数都会自动正确工作 - 完全一样有意的。她应该的。
Wolfram 特征存储库的 shell 和编程结构的设计是为了让每个人都能以最简单、最方便的方式为共同事业做出贡献 - 事实上,只需 通过填写记事本文本文件(带有 nb 扩展名)WL。 内置自动函数允许您检查添加到存储库的新函数,以确保它们集成到语言中。 我们公司押注于能够将其功能集成到语言中的广泛用户,而不是新功能的巨大复杂性 - 尽管有审查过程,但我们并不坚持诸如此类的事情 精心设计分析 或对新用户功能的完整性和可靠性的严格标准,而不是对我们使用的核心语言中内置的功能进行更严格的测试。

这种方法有很多权衡和细节,但我们的目标是优化 Wolfram 功能存储库,既提高用户体验,又确保新的用户功能对语言的开发做出有意义的贡献。 随着我们的成长,我毫不怀疑我们将不得不发明新的方法来处理和验证存储库中内置的函数,尤其是组织大量函数并找到用户需要的函数。 但令人鼓舞的是,我们选择的道路是一个良好的开端。 我个人 添加了几个功能 到原始数据库。 其中许多都是基于我个人开发了相当长一段时间的代码。 我只花了几分钟就将它们推送到存储库。 现在它们已经在存储库中了,我终于可以立即、随时根据需要使用这些函数,而不必担心搜索文件、下载包等。

提高效率的同时降低成本

甚至在互联网出现之前,就有了共享 Wolfram 语言代码的方法(我们的第一个主要集中式项目是 数学源,1991 年基于 CD-ROM 等为 Mathematica 创建)。 当然,提出的基于 Wolfram 函数存储库的实现方法是实现上述任务的更强大、更可靠的工具。

30 多年来,我们公司一直努力维护 Wolfram 语言结构的完整性,这对于确保 Wolfram 语言不仅成为一种编程语言,而且成为一种 成熟的计算语言。 因此,实现 Wolfram 函数存储库的方法的本质是使用统一的方法来编程和开发新函数,这些新函数将按顺序添加并适合该语言的框架,以便它能够发展和共同进化。

每个函数的实现结构中都会发生各种计算过程。 这里需要注意的是,功能必须具有清晰、统一的外观和用户的视觉可读性。 在这种情况下,Wolfram 语言的内置函数提供了超过 6000 个关于如何正确编程函数的连续示例(这些是我们的 现场节目视频其中包括 创建标准程序的过程需要数百小时)。 这种方法最终使 Wolfram 特征存储库能够表现良好的是 Wolfram 语言的结构性质,以及该语言中已内置的大量附加和多样化的库。 例如,如果您有一个处理图像的函数,或者 稀疏数组分子结构地理数据 或其他一些 - 它们一致的符号表示已经存在于语言中,因此,您的函数立即与语言中的其他函数兼容。

创建一个实际上运行良好的存储库是一项有趣的元编程任务。 例如,程序中过多的限制将无法获得算法所需的统一性和通用性。 正如功能限制数量不足一样,您将无法实现足够正确的算法执行顺序。 之前我们公司实施的几个实施这些方法折衷方案的示例运行得相当稳定 - 这些是: 钨项目演示,于 2007 年推出,现在在线运行,有超过 12000 个用户交互式演示。 在 沃尔夫拉姆数据库 有超过 600 个现成的数据库可以在 Wolfram 语言中使用,并且 Wolfram 神经网络存储 几乎每周都会补充新的神经网络(现在已经有 118 个),并且它们通过函数立即连接 网络模型 在 Wolfram 语言中。

所有上述示例都有一个基本特征 - 项目中收集的对象和功能具有非常高的流程结构化和分布程度。 当然,演示、神经网络或其他东西的结构细节可能会有很大差异,但任何当前存储库的基本结构始终保持不变。 那么,亲爱的用户,您对创建这样一个为 Wolfram 语言添加扩展的存储库有何看法? Wolfram 语言被设计得极其灵活,因此可以以任何方式扩展和修改。 这种情况对于使用 Wolfram 语言快速创建各种大型软件项目的能力极其重要。 这里需要注意的是,随着语言灵活性的提高,用这种语言实现的项目的成本必然会增加。 这是因为用户使用这种语言越多,他获得的专用功能就越多,但我们不应该忘记,这种方法也可能有负面影响,即无法确保程序模块的一致一致性。

传统编程语言中的库有一个常见问题——例如,如果您使用一个库,代码将正常工作,但如果您尝试使用多个库,则无法保证它们能够正确交互。 此外,在传统的编程语言中 - 与成熟的计算语言不同 - 无法保证除基本结构之外的任何函数或数据类型存在一致的内置表示。 但事实上,问题比乍一看还要严重:如果要构建大规模的垂直功能,那么如果没有我们投入 Wolfram 语言的集中式项目编程的巨大成本,就不可能实现一致性。 因此,所有软件模块始终正确地协同工作非常重要。

因此,Wolfram 功能存储库背后的想法是通过更容易开发为连贯模块的各个功能,以相对较小的代码片段简单地向语言添加扩展,从而避免上述问题。 话虽如此,有些编程功能无法通过单独的函数来方便地实现(我们公司计划在不久的将来发布优化的编程算法,以帮助实现大规模软件包)。 然而,基于 Wolfram 语言中已内置的函数,有许多基于单个函数实现的编程可能性。 这里的想法是,用相对较少的编程工作,就可以创建许多新的且非常有用的函数,这些函数将提供足够的设计一致性,它们将彼此很好地配合,而且除此之外,它们将来能够在该语言中轻松且广泛地使用。

当然,这种方法是一种妥协。 如果实现一个更大的包,可以想象一个全新的功能世界,它将非常强大和有用。 如果需要获得与其他所有内容相适应的新功能,但您不愿意花费大量精力来开发项目,那么不幸的是,这可能会导致项目范围缩小。 Wolfram 功能存储库背后的想法是为项目的定义部分提供功能;这种方法将添加强大的功能,同时更容易在编程项目中保持良好的一致性。

帮助将自定义函数添加到函数存储库

我们的团队一直在努力让用户能够轻松地为 Wolfram 存储库功能做出贡献。 在桌面上(已经在 版本12.0),您只需依次浏览主菜单选项卡:文件 > 新建 > 存储库项 > 函数存储库项,您将得到“定义笔记本“(在工作台内以编程方式。您还可以使用模拟功能 - 创建笔记本[“功能资源”]):

Wolfram Function Repository:Wolfram 语言扩展的开放访问平台

您需要执行两个主要步骤:首先,实际写下函数的代码,其次,写下说明函数应如何工作的文档。
单击顶部的“打开示例”按钮查看您需要执行的操作的示例:

Wolfram Function Repository:Wolfram 语言扩展的开放访问平台

本质上,您正在尝试创建类似于 Wolfram 语言中的内置函数的东西。 只是它可以做比内置函数更具体的事情。 与此同时,对其完整性和可靠性的期望也会低得多。
您需要为您的函数指定一个遵循 Wolfram 语言的函数命名准则的名称。 此外,您还需要为您的函数开发文档,类似于该语言的内置函数。 稍后我将更详细地讨论这一点。 现在,请注意在定义笔记本文件顶部的按钮行中有一个按钮 “风格指南”,它解释了要做什么,还有一个工具按钮,它提供了用于格式化函数文档的工具。
当您确定所有内容均已正确填写并且准备就绪后,请单击“检查”按钮。 您还没有弄清楚所有细节是完全正常的。 所以“检查”功能会自动运行并进行大量的样式和一致性检查。 通常,它会立即提示您确认并接受更正(例如:“此行必须以冒号结尾”,并且会提示您输入冒号)。 有时她会要求你自己添加或更改一些东西。 我们将不断向“检查”按钮的自动功能添加新功能,但基本上其目的是确保您提交到功能存储库的所有内容都已严格遵循尽可能多的样式指南

Wolfram Function Repository:Wolfram 语言扩展的开放访问平台

因此,运行“检查”后,您可以使用“预览”。 “预览”创建您为函数定义的文档页面的预览。 您还可以为在您的计算机上创建的文件或位于云存储中的文件创建预览。 如果由于某种原因您对预览中看到的内容不满意,只需返回并进行必要的更正,然后再次单击“预览”按钮即可。
现在您已准备好将函数推送到存储库中。 部署按钮为您提供四个选项:

Wolfram Function Repository:Wolfram 语言扩展的开放访问平台

此步骤中重要的事情是您可以将函数提交到 Wolfram 函数存储库,以便任何人都可以使用它。 同时,您还可以为有限数量的用户放置您的功能。 例如,您可以创建一个托管在您的计算机本地的函数,以便在您使用该特定计算机时可用。 或者您可以将其发布在您的 云账户,以便您在连接到云时可以使用它。 您还可以通过您的云帐户公开托管(部署)该功能。 它不会位于中央 Wolfram 功能存储库中,但您可以向某人提供一个 URL,允许他们从您的帐户获取您的功能。 (将来,我们还将支持整个公司的中央存储库。)

假设您想要将函数实际提交到 Wolfram 函数知识库。 为此,请单击存储库的“提交”按钮。 那么现在发生了什么? 您的申请将立即排队等待我们专门的策展人团队的审核和批准。

当您的申请通过审批流程(通常需要几天时间)时,您将收到有关其状态的通信以及可能对未来使用的建议。 但是,一旦您的功能获得批准,它将立即发布到 Wolfram 功能存储库,并可供任何人使用。 (这将出现在 新功能的新闻摘要 等等)

存储中应该有什么?

需要指出的是,我们公司对完整性、可靠性和整体质量有非常高的标准,在过去 6000 多年里我们已经内置到 Wolfram 语言中的 30 多个功能中,全部满足上述要求。 Wolfram 函数存储库的目标是使用 Wolfram 语言中已有的所有结构和功能,以便添加尽可能多的轻量级函数(即更高性能的函数)。

当然,Wolfram 函数存储库中的函数必须符合 Wolfram 语言的设计原则 - 以便它们能够与其他函数充分交互以及用户对函数应如何正常工作的期望。 然而,这些功能不必具有同等的完整性或可靠性。

在 Wolfram 语言的内置函数中,我们努力使编程函数尽可能通用。 话虽这么说,当在 Wolfram 函数存储库中包含一个函数来简单地处理一些非常具体但有用的情况时,这并没有什么问题。 例如,函数 从笔记本发送邮件 可以接收一种特定格式的文件并以一种特定方式创建邮件。 多边形图 创建仅具有某些颜色和标签等的图表。

与内置功能相关的另一点是,我们公司尽力处理所有非典型情况,正确处理错误的输入等等。 在函数存储库中,有一个特殊函数处理解决问题的主要情况并忽略所有其他情况是完全正常的。

显而易见的一点是,最好拥有做得更多、做得更好的函数,但函数存储库的优化(与 Wolfram 语言的内置函数相反)应该将更多函数与更多函数捆绑在一起,而不是深入研究各个具体功能的实现流程。

现在让我们看一个在存储库中测试函数的示例。 对此类函数的一致性期望自然远低于内置语言函数。 在函数依赖于 API 等外部资源的情况下尤其如此,持续进行一致的测试非常重要,这会在验证算法中自动发生。 在 nb 文件中,您可以显式指定定义(在“附加信息”部分中)并指定由输入和输出字符串或类型的完整字符对象定义的尽可能多的测试 验证测试,只要您认为合适。 此外,系统不断尝试将您提供的文档示例转变为验证过程(有时这可能非常消耗资源,例如,对于结果取决于随机数或一天中的时间的函数)。

因此,函数存储库将具有许多实现复杂性。 有些只是一行代码,其他的可能涉及数千或数万行,可能使用许多辅助函数。 什么时候值得添加一个需要很少代码来定义的函数? 基本上,如果对于一个函数有 好记的名字,如果用户在一段代码中看到它,就很容易理解,那么它已经可以添加了。 否则,最好在每次需要使用代码时将代码重新附加到程序中。

函数存储库(顾名思义)的主要目的是向语言中引入新功能。 如果您想添加新数据或 新实体, 用 Wolfram 数据存储库。 但是如果您想为计算引入新类型的对象怎么办?

实际上有两种方法。 您可能想要引入将在函数存储库中的新函数中使用的新对象类型。 在这种情况下,您始终可以写下其符号表示形式,并在函数存储库中输入或输出函数时使用它。

但是,如果您想要表示一个对象,然后通过 Wolfram 语言中的现有函数定义您想要使用的对象,该怎么办? Wolfram 语言始终为此提供一个轻量级机制,称为 升值。 有一些限制(特别是对于以下功能) 无法评估他们的论点),函数存储库允许您简单地表示一个函数并为其定义值。 (在创建完全集成到 Wolfram 语言中的新的主要设计时提高一致性期望通常是一个非常重要的过程,不能通过简单地增加项目成本来实现,并且是我们公司作为项目一部分所做的事情对于语言的长期开发,此任务不是作为存储库开发的一部分设定的目标)。

那么,函数存储库中的函数代码可能包含哪些内容? Wolfram 语言中内置的所有内容,当然(至少如果它不代表 危险的安全 以及程序本身(作为计算环境)的性能以及函数存储库中的任何函数。 但是,还有其他功能:函数存储库中的函数可以调用 API,或者 沃尔夫拉姆云来自另一个来源。 当然,这也存在一些风险。 由于无法保证 API 不会更改,并且函数存储中的函数将停止工作。 为了帮助识别此类问题,文档页面(在“要求”部分)上针对任何不仅仅依赖于内置 Wolfram 语言功能的功能提供了注释。 (当然,当涉及到真实数据时,即使使用此功能也可能会出现问题 - 因为现实世界的数据在不断变化,有时甚至其定义和结构也会发生变化。)

Wolfram 功能存储库的所有代码都应该用 Wolfram 编写吗? 当然,外部API内部的代码不应该用Wolfram语言编写,它甚至不构成语言代码。 事实上,如果您在几乎任何外部语言或库中找到一个函数,您都可以创建一个包装器,允许您在 Wolfram 函数存储库中使用它。 (通常您应该使用内置函数来实现此目的 外部评估 или 外部函数 以 Wolfram 语言代码表示。)

那么这样做有什么意义呢? 从本质上讲,这允许您使用整个集成的 Wolfram 语言系统及其整套统一的软件功能。 如果您从外部库或语言获得基本实现,则可以使用 Wolfram 语言丰富的符号结构来创建方便的顶级函数,使用户可以轻松使用已实现的任何功能. 至少,在加载库等的所有构建块都存在的理想世界中,这应该是可行的,在这种情况下,它们将由 Wolfram 语言自动处理。 (需要注意的是,实际应用中可能会出现问题 设置外部语言 特定的计算机系统和云存储可能会带来额外的安全问题)。

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

知识库的“生态系统”

如果您编写了经常使用的函数,请将它们提交到 Wolfram 函数存储库! 如果没有产生更多的东西(语言开发),那么即使这样,您使用这些功能供个人使用也会方便得多。 然而,可以合理地假设,如果您定期使用这些功能,也许其他用户也会发现它们很有用。

当然,您可能会发现自己处于无法或不想共享您的功能或无法访问私人信息资源的情况。 即使在这种情况下,您也可以简单地将功能部署在您自己的云帐户中, 明确权利 访问他们。 (如果您的组织有 Wolfram 企业私有云,那么它将很快能够托管自己的私有功能存储库,该存储库可以在您的组织内部进行管理,并设置是否强制第三方用户查看视图。)

您提交到 Wolfram 函数存储库的函数不必是完美的; 它们必须是有用的。 这有点像经典 Unix 文档中的“错误”部分 - 在“定义部分”中有一个“作者注释”部分,您可以在其中描述您已经了解的函数的限制、问题等。 此外,当您将功能提交到存储库时,您可以添加提交注释,这些注释将由专门的策展人团队阅读。

一旦功能发布,其页面底部总是有两个链接:“发送有关此功能的消息“和”在 Wolfram 社区中讨论” 如果您要附加注释(例如,告诉我有关错误的信息),您可以选中表示您希望与功能作者共享您的消息和联系信息的框。

有时您只想使用 Wolfram 函数存储库中的函数,例如内置函数,而不查看其代码。 然而,如果你想看看里面,顶部总是有一个记事本按钮。 单击它,您将获得提交到功能存储库的原始定义笔记本的副本。 有时您可以将其用作您需要的示例。 同时,您也可以自行开发修改此功能。 您可能希望将这些从存储库中找到的函数发布到您的计算机上或您的 aphid 云存储帐户中,也许您希望将它们提交到函数知识库,也许作为原始函数的改进、扩展版本。

将来,我们计划支持 Git 风格的功能存储库分叉,但现在我们试图保持简单,并且我们始终只为语言中内置的每个功能提供一个可接受的版本。 通常情况下(除非开发人员放弃维护他们开发的功能并响应用户提交),该功能的原始作者控制其更新并提交新版本,然后进行审核,如果他们通过了审核流程,以该语言出版。

让我们考虑一下开发功能的“版本控制”如何工作的问题。 现在,当您使用函数存储库中的函数时,其定义将永久存储在您的计算机上(如果您使用云,则存储在您的云帐户中)。 如果某功能有新版本可用,下次使用时您将收到一条消息通知您。 如果您想将该功能更新到新版本,可以使用以下命令来完成 资源更新。 (“函数 blob”实际上存储了更多版本控制信息,我们计划将来让用户更容易访问这些信息。)

Wolfram 函数存储库的优点之一是任何地方的任何 Wolfram 语言程序都可以使用其中的函数。 如果程序出现在记事本中,则通常可以方便地将存储库函数格式化为易于阅读的“函数二进制对象”函数(可能具有适当的版本集)。

您始终可以使用文本访问函数存储库中的任何函数 资源函数[...]。 如果您直接为 Wolfram 引擎编写代码或脚本,这会非常方便,例如, 使用 IDE 或文本代码编辑器 (特别需要注意的是,函数库完全兼容 为开发者提供的免费 Wolfram 引擎).

它是如何工作的呢?

在 Wolfram 存储库的函数内部,可以使用完全相同的函数 资源系统 碱基,如 我们所有其他现有的存储库 (数据存储, 神经网络存储库, 演示项目集合 等),像所有其他 Wolfram 系统资源一样, 资源功能 最终基于功能 资源对象.

考虑 资源功能:

Wolfram Function Repository:Wolfram 语言扩展的开放访问平台

里面可以看到一些使用函数的信息 资讯:

Wolfram Function Repository:Wolfram 语言扩展的开放访问平台

如何设置资源功能? 最简单的就是纯粹的本地案例。 下面是一个示例,它采用一个函数(在本例中只是一个纯函数)并将其定义为给定程序会话的资源函数:

Wolfram Function Repository:Wolfram 语言扩展的开放访问平台

定义完成后,就可以使用资源函数:

Wolfram Function Repository:Wolfram 语言扩展的开放访问平台

请注意,该函数 blob 中有一个黑色图标 Wolfram Function Repository:Wolfram 语言扩展的开放访问平台。 这意味着BLOB函数指的是为当前会话定义的内存资源函数。 永久存储在您的计算机或云帐户上的资源功能具有灰色图标 Wolfram Function Repository:Wolfram 语言扩展的开放访问平台。 Wolfram 功能存储库中的官方资源功能有一个橙色图标 Wolfram Function Repository:Wolfram 语言扩展的开放访问平台.

那么当您使用定义笔记本中的展开菜单时会发生什么? 首先,它获取记事本中的所有定义,并从中创建一个符号 资源对象)。 (如果您使用的是基于文本的 IDE 或程序,那么您还可以显式创建 资源对象)

使用以下命令从计算机上的存储库本地部署函数 本地缓存 将资源对象另存为 本地对象 在您的文件系统上。 使用命令完成部署到云帐户 云部署 对于资源对象,公有云部署是 云发布。 在所有情况下 资源寄存器 也用来注册资源函数名,所以 资源函数[“姓名”] 会工作的。

如果单击函数存储库的“提交”按钮,其下方会发生什么 资源提交 调用资源对象。 (如果你使用的是文本输入界面,你也可以调用 资源提交 直接地。)

默认情况下,提交是用与您的 Wolfram ID 关联的名称进行的。 但如果您代表开发团队或组织提交申请,您可以 设置单独的发布者 ID 而是使用它作为与您的视图交互的名称。

将任何函数提交到函数知识库后,它将排队等待审核。 如果您收到回复评论,它们通常采用文本文件的形式,并添加了额外的“评论单元格”。 您可以随时访问以下网站查看您的申请状态 资源系统会员门户。 但是,一旦您的功能获得批准,您将收到通知(通过电子邮件),并且您的功能将发布到 Wolfram 功能存储库。

工作中的一些微妙之处

乍一看,您似乎可以只需要一个定义笔记本并将其逐字放入函数存储库中,但是,实际上涉及很多微妙之处 - 处理它们需要进行一些相当复杂的元编程,处理符号处理作为定义函数的代码,以及记事本本身的定义。 其中大部分发生在内部、幕后,但如果您要为功能知识库做出贡献,它可能会产生一些值得理解的含义。

第一个直接的微妙之处:当您填写定义笔记本时,您可以使用类似的名称在任何地方简单地引用您的函数 我的功能,它看起来像 Wolfram 语言中函数的常规名称,但对于函数存储库文档,它被替换 资源函数[“我的功能”] 是用户在使用该功能时实际使用的内容。

第二个微妙之处:当您从定义笔记本创建资源函数时,必须捕获并显式包含函数定义中涉及的所有依赖项。 然而,为了确保定义保持模块化,您需要将所有内容放在一个唯一的 名称空间。 (当然, 完成这一切的函数,位于函数存储库中。)

通常,您永远不会看到任何用于配置此命名空间的代码的痕迹。 但是,如果由于某种原因您在函数内调用了未执行的符号,那么您将看到该符号位于函数的内部上下文中。 然而,在处理定义记事本时,至少函数本身对应的符号是 可调节以获得最佳显示效果 作为内部上下文中的功能性 BLOB 而不是原始字符。

函数存储库用于定义新函数。 并且这些功能可能有选项。 通常这些参数(例如, 付款方式 или 图片尺寸) 将能够用于内置函数,以及那些已经存在内置符号的函数。 但有时新功能可能需要新选项。 为了保持模块化,这些参数需要是在唯一的内部上下文中定义的符号(或者类似整个资源函数,即它们本身)。 为简单起见,函数存储库允许您在字符串定义中定义新选项。 为了方便用户,这些定义(假设他们使用 选项值 и 选项模式) 也经过处理,以便在使用函数时,参数不仅可以指定为字符串,还可以指定为同名的全局符号。

大多数函数只是在每次调用时执行它们应该执行的操作,但有些函数需要在特定会话中运行之前进行初始化 - 为了解决这个问题,定义部分中有一个“初始化”部分。

存储库中的函数可以使用存储库中已有的其他函数;为了为包含两个(或更多)相互引用的函数的函数存储库设置定义,您必须将它们部署在程序会话中,以便您可以像他们一样参考 资源函数[“姓名”],然后您可以创建所需的这些函数的组合、示例(我不明白),并根据之前发布的函数将新函数添加到存储库中。 (或者已经或以前——这两个词都很笨拙)

发展前景。 当存储库变得非常大时会发生什么?

今天我们刚刚推出 Wolfram 特征存储库,但随着时间的推移,我们预计它的大小和功能可能会急剧增加,并且随着它的发展不断增长,我们已经预计可能会出现各种问题。

第一个问题涉及函数名称及其唯一性。 函数存储库的设计方式与 Wolfram 语言中的内置函数一样,您只需指定函数名称即可引用任何给定函数。 但这不可避免地意味着函数名称在整个存储库中必须是全局唯一的,因此,例如,只能有一个 资源函数[“我最喜欢的功能”].

乍一看,这似乎是一个大问题,但值得注意的是,这基本上与互联网域或社交媒体句柄等问题相同。 事实上,系统只需要一个注册器 - 这是我们公司将为 Wolfram 函数知识库扮演的角色之一。 (对于存储库的私有版本,其注册商可能是管理员。)当然,可以在没有任何内容的情况下注册 Internet 域,但在函数存储库中,只有在存在实际定义的情况下才能注册函数名称。功能。

我们在管理 Wolfram 函数知识库方面的部分职责是确保为函数选择的名称在给定函数定义的情况下是合乎逻辑的,并且它遵循 Wolfram 语言命名约定。 我们在 Wolfram 语言中命名内置函数方面拥有 30 多年的经验,我们的管理者团队也将把这些经验带到函数存储库中。 当然,总有例外。 例如,对某些函数使用简短的名称似乎更可取,但最好使用更长、更具体的名称来“捍卫”,因为您将来不太可能遇到想要创建类似函数名称的人。

(这里应该注意的是,简单地添加一些成员标签来消除函数歧义不会达到预期的效果。因为除非您坚持始终分配标签,否则您将需要为任何给定函数定义默认标签,并分配作者标签,这又需要全球协调。)

随着 Wolfram 函数知识库的增长,可能出现的问题之一是函数的可发现性,系统为此提供了 搜索功能 (定义文件可能包括关键字等)。 对于 Wolfram 语言中的内置函数,文档中有各种交叉引用来帮助“宣传”这些函数。 函数存储库中的函数可以引用内置函数。 但反过来呢? 为此,我们将尝试不同的设计,以在内置函数的文档页面中公开存储库函数。

对于 Wolfram 语言中的内置函数,有一个所谓的检测层,由 “帮助页面”网络,它提供与特定领域相关的功能的有组织的列表。 正确平衡手册页总是很困难,并且随着 Wolfram 语言的发展,手册页通常需要完全重新组织。 将存储库中的函数分为广泛的类别,甚至一致地分解这些类别非常容易,但拥有正确组织的语言参考页面更有价值。 目前尚不清楚如何最好地为整个函数知识库创建它们。 例如, 创建资源对象库 在功能存储库中,任何人都可以发布包含他们从存储库中“选择”的网页:

Wolfram Function Repository:Wolfram 语言扩展的开放访问平台

Wolfram 函数存储库被配置为持久函数存储库,其中的任何函数都将始终有效。 当然,新版本的功能可能会可用,并且我们预计某些功能当然会随着时间的推移而过时。 如果这些函数在程序中使用,它们就可以工作,但它们的文档页面将链接到新的、更高级的函数。

Wolfram 功能存储库旨在帮助您快速发现新功能并学习使用 Wolfram 语言的新方法。 我们非常乐观地认为,功能存储库中探索的一些内容最终将成为核心 Wolfram 语言的内置部分。 在过去的十年里,我们有过类似的系列 最初在 Wolfram 中引入的功能 | Α。 从这次经历中吸取的教训之一是,要达到我们在 Wolfram 语言内置的所有内容中所关注的质量和一致性标准,需要做大量的工作,这通常比最初实现该想法的努力更加困难。 即便如此,函数知识库中的函数可以作为未来函数的非常有用的概念证明,该函数最终可能构建到 Wolfram 语言中。

这里最重要的是,函数存储库中的函数现在可供每个用户使用。 原生语言功能可能会更好、性能更高,但功能存储库将允许用户立即访问所有新功能。 而且,最重要的是,这个概念允许每个人添加他们想要的任何新功能。

在 Wolfram 语言历史的早期,这个想法不会像现在这样有效,但在现阶段,人们在该语言上投入了如此多的努力,并且对语言设计原理有了如此深刻的理解,以至于现在看起来相当不错。大型用户社区可以添加保持设计一致性的功能,使其对广泛的用户有用。

Wolfram 语言用户社区中有一种令人难以置信的人才精神(?)。 (当然,这个社区包括许多各个领域领先的研发专家。)我希望 Wolfram Feature Repository 能够为释放和传播这种人才精神提供一个有效的平台。 只有共同努力,我们才能创造出能够显着扩展 Wolfram 语言计算范式的应用领域的东西。

30 多年来,我们在 Wolfram 语言方面取得了长足的进步。 现在,让我们一起走得更远。 我强烈鼓励世界各地所有受人尊敬的 Wolfram 语言用户使用函数存储库作为平台,以及新的软件项目,例如面向开发人员的免费 Wolfram 引擎。

来源: habr.com

添加评论