2024 Clojure 状态调查! 中分享你的想法。

欢迎!请参阅 关于页面 了解此处的更多信息。

+1
规范
截至 1.9.0-alpha13,注册表中的规格缺少 :file 元数据,尽管有 :line 和 :column


user=> (require '[clojure.spec :as s])
user=> (-> (s/registry) (get :clojure.core.specs/arg-list) (meta))
{:line 1118, :column 5, :clojure.spec/name :clojure.core.specs/arg-list}
user=> (-> (s/registry) (get 'clojure.core/let) (meta))
{:line 1675, :column 5, :clojure.spec/name clojure.core/let}


这将是很有用的,因为
* 我们可以通过筛选注册表来列出项目定义的所有规格。
* 我们可以阅读规格的源代码,如 clojure.repl/source,用于格式化。

(特别是,用于 Codox https://github.com/weavejester/codox/pull/134 )

我快速浏览了一下,但看不到元数据设置在哪里。
感谢

5 个答案

0

评论者:alexmiller

顺便说一下,你现在可以使用 s/describe 或 s/form 来获取规格的源代码。

0
_评论者:floybix_

以下在我的测试中有效。(测试时我使用了 {{in-ns}}, {{@#'registry-ref}}, {{'#ns-qualify'}})).

方法是在 def 之后设置注册项的元数据。仅对 def'd 值设置元数据是不够的,因为它在 def 内随 后被修改。


(ns clojure.spec)
(alias 'c 'clojure.core)

(defmacro def
  [k spec-form]
  (let [k (if (symbol? k) (ns-qualify k) k)
        m (assoc (meta &form) :file *file*)]
    `(do
       (def-impl '~k '~(res spec-form) ~spec-form)
       (swap! registry-ref update '~k vary-meta c/merge ~m)
       '~k)))

(defmacro fdef
  [fn-sym & specs]
  (let [k (ns-qualify fn-sym)
        m (assoc (meta &form) :file *file*)]
    `(do
       (clojure.spec/def ~fn-sym (clojure.spec/fspec ~@specs))
       (swap! registry-ref update '~k vary-meta c/merge ~m)
       '~k)))




顺便说一下,你现在可以使用 s/describe 或 s/form 来获取规格的源代码。


是的,这很好,除了当规格较长并且需要换行和缩进以帮助时。
0
by

评论人:wagjo

请注意,当前 :line 和 :column 元数据并没有指向规格定义的位置,而是指向 clojure/spec.clj 文件,例如第二个例子 (c.c/let) 指向的是 (链接: https://github.com/clojure/clojure/blob/c0326d2386dd1227f35f46f1c75a8f87e2e93076/src/clj/clojure/spec.clj#L1675 文本:fspec-impl)

0
by
_评论人:martinklepsch_

我一直在这件事上寻找解决方案,并且对于不是 {{ident?}} 的规格,我们可以使用元数据或者描述 {{regex?}} 规格的映射。

对于 {{ident?}} 规格我不确定如何处理额外的数据,它可能存储在注册表的另一个位置,这可能是一个可行的途径。

使用任何这些方法,我不太清楚如何以一致的方式将这些信息集成到 {{get-spec}} 的返回值中,因为它的返回值可能不是映射(因此不可扩展。)

将它们存储在注册表的另一个位置,如之前所述,但这需要另一个函数或协议方法来获取关于源文件/行/列的信息。

0
by
参考: https://clojure.atlassian.net/browse/CLJ-2037 (由 alex+import 报告)
...