Мне интересно, есть ли способ из одного пространства имен изменить спецификацию в другом пространстве имен и при этом сохранить использование этой модифицированной спецификации в последующих спецификациях.Вариант использования: пространство имен, выполняющее переопределение, хочет создать переменную nilable
.
. В качестве упрощенного примера предположим, что основное пространство имен имеет следующие спецификации:
(ns ns-test.core
(:require [clojure.spec.alpha :as s]))
(s/def ::string-spec string?)
(s/def ::string-vec (s/coll-of ::string-spec))
Затем переопределенное пространство имен хочет использовать спецификацию ::string-vec
, но хочет сделать отдельные элементы обнуляемыми.Когда я реализую это следующим образом:
(ns ns-test.override
(:require [clojure.spec.alpha :as s]
[ns-test.core :as c]))
(prn "1" (s/valid? ::c/string-vec ["s"]))
(prn "2" (s/valid? ::c/string-vec [nil]))
(in-ns 'ns-test.core)
(s/def ::string-spec (s/nilable string?))
(in-ns 'ns-test.override)
(prn "3" (s/valid? ::c/string-vec ["s"]))
(prn "4" (s/valid? ::c/string-spec nil))
(prn "5" (s/valid? ::c/string-vec [nil]))
Это меняет ::c/string-spec
, но не ::c/string-vec
, и я не хочу копировать все зависимые спецификации и переопределять их, поскольку они не меняются сопределение, отличное от единственного var, которое используется во многих других местах.
"1" true
"2" false
#namespace[ns-test.core]
:ns-test.core/string-spec
#namespace[ns-test.override]
"3" true
"4" true
"5" false
Есть ли способ сделать это?