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

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

0
Spec

难道期望所有已经fdef'过的函数都启用 st/instrument 吗?(例如,(st/instrument))?例如,假设一个库有一个公共API调用一些带有fdef的内部函数。如果fdefs包含在发布的库中,是否期望即使在内部,对那些内部函数的调用也应传递它们的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,或者这是库应该维护的事情?或许库不应在内部函数中包含fdefs?

1 个答案

+1

已被选为最佳答案
 
最佳答案

是的,期望私有函数上的fdef可以被instrumented(它毕竟只是一个var包装器)。

我认为在独立的名称空间中有内部/private函数的specs是个好主意,这样其使用就可以通过load来控制(lib可以加载它进行测试,用户则不会,并且可能甚至不知道它的存在)。

此外,我认为通常在 st/instrument 中对一组 fdef 定义的函数进行instrument化(使用 st/enumerate-namespace 作为辅助工具)是一个好主意。

...