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

欢迎!请查看关于页面以了解更多关于如何使用本网站的信息。

0
Spec

是否预期在所有fdef'函数(例如(st/instrument))上启用st/instrument?例如,假设一个库有一个公共API调用一些内部函数,这些函数已使用fdef进行了spec。如果fdef包括在发布的库中,那么预期调用这些内部函数时应该传递它们指定的fdef,即使它们是内部的?以下是一个示例代码。

(ns my-lib.impl
  (:require
    [clojure.spec.alpha :as s]))

(defn- do-internal-thing
  [x]
  x)

(s/fdef do-internal-thing
  :args (s/cat :x number?))

(ns my-lib.api
  (:require
    [clojure.spec.alpha :as s]
    [my-lib.impl :as impl]))

(defn do-thing
  [y]
  (impl/do-internal-thing "oops"))

如果我调用api函数do-thing,我会在调用impl/do-internal-thing时遇到instrumentation异常。是否应该预期Spec的instrumentation用户筛选出一组fdef'函数并将筛选后的列表传递给st/instrument,或者这是库应该负责的事情?也许库不应该包括内部函数的fdef?

1 答案

+1

被选中
 
最佳答案

是的,预期可以通过instrument(它本质上是var包装器)对私有函数上的fdef进行instrument。

我认为将内部/私有函数中的spec放在独立的命名空间中可能是一个好主意,以便可以通过load(lib可以加载它进行测试,用户不会,而且可能甚至不知道其存在)来控制其使用。

此外,我认为通常在st/instrument中对一系列由fdef定义的函数进行检测(以st/enumerate-namespace作为辅助)是一个好主意。

...