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

欢迎!有关如何使用本站的信息,请查看关于页面。

0 投票
规范
# 规范元数据支持

问题:目前没有将元数据附加到规范的方法

能够添加文档字符串(主要用例)会很好
或者在不同上下文中使用该规范的有用信息
(静态代码分析器、自定义转换/强制转换、它与特定数据库架构的关系、可读性错误消息
模板、领域特定关注点或甚至稍后 clj.spec 本身,等等)。
理论上,人们可以今天创建自己的元数据注册表并

在库级别处理此事,一些特定于规范的
项目已经这样做了,但有一个统一/标准的方式
来做这一点会更好。默认情况下,最好首先添加文档字符串
支持。它可以采取以下两种形式之一
至少以下两种


(s/def ::foo "这是一个 foo" any?)
(s/def ::foo string? {:doc "这是一个 foo" :cassandra-type :varchar})
;; 根据实现可能还有这些

(s/spec #() :gen ... :meta ...)
(with-meta (s/spec ...))
有几种方法可以实现这一点,各有优劣


* 实现 IMeta 协议

这似乎是干净的方法,元数据将在任何规范级别受到支持
(例如非注册的规范谓词、集合规范等)。虽然实现将需要
对现有代码进行相当多的更改,但这主要是添加一个元数据参数到
各种*-spec-impl 宏和在 `s/def` 及其衍生的级别。
那个方法的棘手之处在于注册的规范
引用另一个规范仅是一个“链接”(一个关键字),因此我们
现在无处添加元数据。
它们可以具体化,返回对原始规范的“指针”,并在自己的级别
保持元数据。
它们可以在自己的级别保持元数据。
这种做法很直接,meta 数据将在任何规范级别得到支持。

* 使用简单的注册表(类似于规范注册表
或以某种方式集成到主规范注册表中)
基本上是一个 spec-kw -> meta 数据的映射,如果在一个单独的注册表中,
或者以某种方式集成到主注册表中。
这是简单的做法,只支持注册的规范,将元数据与其他内容
分开,会使规范实例稍微轻一些。引用其他规范的规范也可以有自己的元数据。
如前所述,这可以在单独的注册表中完成或在主要规范注册表
中的规范值中完成。

IMeta 似乎可能是更好的解决方案,我们会利用现有的“meta” api。

5 个答案

0 投票
by
_评论由:bronsa_发表

(s/def ^{:doc "某物是 foo 类型" :cassandra-type :varchar} ::foo 字符串?)不是有效的Clojure语法,无法给关键字添加元数据
0 投票
by

评论由:mpenet发表

根据Nicolas的评论修改了示例。

0 投票
by

评论由:jafingerhut发表

与柳J-1965相关(如果不是重复的)

0 投票
by

评论由:alexmiller发表

这与其CLJ-1965相关,但并非同一种情况 - 这里的范围更广,可能支持任何元数据。

0 投票
by
参考:[https://clojure.atlassian.net/browse/CLJ-2194](https://clojure.atlassian.net/browse/CLJ-2194)(由mpenet提供)
...