什么是 Clojure 规范?

What is Clojure spec?

我无法理解 clojure.spec

的意图

它解决了什么样的问题?

我们为什么要使用它?

那些关于规范库的问题有点宽泛,尤其是 "why should we use it" 部分。 您阅读以下内容了吗?

spec 允许您为数据和函数创建规范。规范的核心是谓词(基于现有的 Clojure 谓词)和结构,而不是像您在静态类型语言中看到的那样基于类型。通过将规范基于谓词,您可以编写比大多数类型系统更具表现力的规范,并使用与您的代码相同的语言。

在函数上定义的规范指定了 args 的规范,return 值,以及 args 的函数 return。最后一个允许检查的范围比在大多数类型或合同系统中检查的范围大得多(容易)。

定义规范后,您可以使用它们来:

  • 根据规范检查值是否有效
  • "Conform" 一个值,它为您提供该值的解析和解构版本
  • 详细解释为什么值不符合规范(作为字符串、标准输出或作为数据)
  • 使用描述性规范增强功能文档
  • 从规范生成示例数据
  • 在开发中断言一致性但在生产中关闭它们
  • 检测开发或测试中对检测函数的无效调用
  • 为指定函数生成和运行 属性 测试
  • 开发将检测和测试生成与存根和模拟设施相结合的测试

您可以使用规范来改进您的开发(通过阐明和记录您的意图、捕获无效调用和断言数据有效性)、您的测试(捕获无效调用、断言有效性、生成示例数据以及为以下内容生成自动测试)您指定的功能)和您的产品(通过使用一致性进行解构)。

此外,Clojure 核心对规范的使用将导致更好的错误消息和扩展的核心库使用开发时检查,以便更早地发现错误。