2024年Clojure状态调查中分享您的想法!

欢迎!请参阅关于页面以获取有关如何使用的更多信息。

0
Spec

目前,core.specs.alpha只包含一些基本特殊形式和宏的规格。

它能扩展以包含clojure.core中定义的所有函数吗?或者,也许可以有一个包含这些规格的可选命名空间?我想象如果这些规格可用于仪表化,将非常有帮助,对于培训新的Clojure程序员和查找错误。

1 回答

+2

我们不打算为core中的函数添加规格。规格对于描述语法(主要是宏,我们预计将继续添加)和信息性类型(包含键等的映射)最有用。对于通用和高阶函数的诱惑是尝试写非常详细的规格,这些规格在遇到core中那些积极泛型和多态函数的添加时可能会被破坏。此外,当使用大量规格化函数时,确实会有性能影响,并且由于频繁使用相对少量函数,这是Clojure程序往往具有的特性,这种性能影响被放大。

关于物种2功能集成正在考虑各种事物,这将使我们可以对高阶函数说更多有趣的事情,也许这将在未来某个时候改变这里的兴趣平衡。

话虽如此,在https://github.com/borkdude/speculative有一个非官方的社区核心规格库,它们大多是合理的(但仍然会遇到上述问题)。如果您使用所有这些进行仪表化,可以亲自体验性能问题。

因此,我认为我提到量测可能是我的一个错误。我想到的更好的用例是更高级的静态代码分析。我拥有TypeScript背景,其中人们会避免创建您所说的非常详细的类型,而是用一个类型来部分描述他们的代码库,但当你将这个通过VSCode内建的TypeScript语言服务器执行,它会产生巨大的价值!Clojure最近大幅改进了其静态分析工具,如clj-kondo。如果这些工具能访问clojure.core的完整规格,它们就能为开发者提供大量信息,对性能影响为0。你甚至可以使用简单地引用任何事物的'any'规格,你可以在规格中保持那种通用的和泛型条件性。
kondo不是已经有了这个功能吗?

编辑
实际上并不是,并不完整。kondo的类型检查系统有点修补起来的。例如,每次它需要做条件类型检查时,都必须输入一个自定义函数。

kondo为core.into有一个自定义函数,它指示返回类型与传递给其第一个参数的集合的类型相同。已经在他们的JIRA看板上有关于添加到另一个函数的ticket,以及在许多其他函数上也没有遵循。例如,函数inc如果在inc中传递了一个整数值,kondo就不知道输出是否仍然是整数。

例如。
以下代码:(nth [1 2 3] 1.5)在kondo中会抛出一个错误(然而,这是不正确的,nth定义了非整数)。
但以下代码(nth [1 2 3] (inc 0.5))通过没有任何错误。

如果继续这样下去,kondo将不得不携带大量逻辑,这些逻辑不一定属于他们的代码库。

如果用户想实现或扩展类似逻辑,这将很困难。没有简单且易于理解的方式来定义它。我原本希望规范能够发展成为开发者以 TypeScript 风格在自身代码库中编码必要类型逻辑的标准方式。例如,如果在你代码库中定义一个集合为整数的集合,或为数据库定义某种自定义类型的集合很重要,那么这些信息将传达给 kondo,它可以依据这些信息执行逻辑,并提前看到一些可能会失败的转换。Spec 和 Malli 已经有一些用于此的系统,但 kondo 目前还没有逻辑来完成它。

我不确定用于进行此类分析的适当逻辑是否应在 kondo 本身实现,还是应在 clojure 代码库的某处实现,因为它是完全依赖于 clojure 的 API 的。我也不知道 spec 或 spec2 是否持有它的正确位置。这就是为什么我在这里提出这个问题。
...