2024 年Clojure状况调查! 分享您的想法。

欢迎!请查看 关于 页面以获取更多关于这个工作方式的信息。

+1
Spec
截至 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}} 内部随后被更改。


(ns clojure.spec)
(别名 'c 'clojure.core)

(定义宏 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)))

(定义宏 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
【回答】

评论者: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
【回答】
_评论者:martinklepsch_

我正在寻找修复此问题的方法,对于不是 {{ident?}} 的规范,我们可以使用元数据或描述 {{regex?}} 规范的映射。

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

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

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

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