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

欢迎!请查看关于页面了解更多关于这个平台的信息。

+1
Spec
截至1.9.0-alpha13版本,注册表中的spec虽然没有:行和:列的信息,但缺少:文件元数据


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}


这将会很有用,因为
* 我们可以通过过滤注册表来列出项目中定义的所有spec。
* 我们可以读取spec的源代码,比如使用 clojure.repl/source,进行美观格式化。

(特别是为了在Codox https://github.com/weavejester/codox/pull/134 中使用)

我快速浏览了一下,但没有看到元数据设置在哪里。
祝好

5 个答案

0

评论由: alexmiller

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

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 来获取spec的源代码。


是的,很好,但是当需要换行和缩进时,较长的规范可能会麻烦。
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 报告)
...