我可以用Clojure规范验证函数吗?

我可以用Clojure规范验证函数吗?,clojure,clojure.spec,Clojure,Clojure.spec,我可以使用Clojure规范系统定义函数签名并验证函数是否满足它们吗 下面是一些我尝试过但没有成功的例子 (s/valid?(s/fspec:args string?:ret string?)标识);;假的 (def nope标识) (s/valid?(s/fspec:args字符串?:ret字符串?)否);;假的 (s/conform(s/fspec:args string?:ret string?)标识);;无效的 (defn strmap[s]{:pre[(s/valid?string?s

我可以使用Clojure规范系统定义函数签名并验证函数是否满足它们吗

下面是一些我尝试过但没有成功的例子

(s/valid?(s/fspec:args string?:ret string?)标识);;假的
(def nope标识)
(s/valid?(s/fspec:args字符串?:ret字符串?)否);;假的
(s/conform(s/fspec:args string?:ret string?)标识);;无效的
(defn strmap[s]{:pre[(s/valid?string?s)]:post[(s/valid?string?%)]}s)
(s/valid?(s/fspec:args string?:ret string?)strmap);;假的
(s/fdef strmap:args字符串?:ret字符串?)
(s/valid?strmap strmap);;真的
(s/def::str pred(s/fspec:args string?:ret boolean?)
(s/valid::str pred(fn[s]true));;假的

我知道fdef,但我想要一些我能写的东西。例如,创建相关函数签名的映射。

clojure.spec的替代方案是一个数据驱动的模式库,它具有

您可以使用
s/get spec
访问函数的
:args
:ret
规范,然后验证:

user=> (require '[clojure.spec.alpha :as s])
nil
user=> (defn strmap [s] s)
#'user/strmap
user=> (s/fdef strmap :args string? :ret string?)
user/strmap
user=> (s/valid? (:args (s/get-spec `strmap)) "foo")
true
user=> (s/valid? (:args (s/get-spec `strmap)) :bar)
false

我在中使用了它。

原来spec确实处理函数,但它希望参数是元组

(s/valid?(s/fspec:args(s/cat:arg1字符串?:ret字符串?)标识);;真的!
(s/valid?(s/fspec:args(s/cat:arg1字符串?:ret字符串?);;真的
(s/valid?(s/fspec:args(s/cat:arg1字符串?:ret字符串?)(fn[x]x));;真的
(s/valid?(s/fspec:args(s/cat:arg1字符串?:ret字符串?)(fn[x]42));;假的
匿名函数literal似乎存在一些问题。我可能对宏观扩张有些误解

(s/valid?(s/fspec:args(s/cat:arg1字符串?):ret字符串?#%);;假的

我不希望迁移我当前的规范。像规范这样的官方库也是工具集成的最佳选择。Hmm。我需要玩这个。我想我想要的是将
(s/get spec`strmap)
与一些
s/fspec
进行比较。最初的调查看起来不太有希望
(=(:args(s/get spec`strmap))(s/spec string?)返回false值得注意的是,
(=(s/spec string?)(s/spec string?)是true,但是
(s/get spec::hi string?)((s/get spec::hi)(s/spec string?)是false<代码>(def hi(s/spec字符串?)(=hi(s/spec字符串?)
也为false。我想我还不明白