Переопределение спецификации Clojure в другом пространстве имен - PullRequest
0 голосов
/ 19 сентября 2019

Мне интересно, есть ли способ из одного пространства имен изменить спецификацию в другом пространстве имен и при этом сохранить использование этой модифицированной спецификации в последующих спецификациях.Вариант использования: пространство имен, выполняющее переопределение, хочет создать переменную 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                                                                                                                                                                                                

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 20 сентября 2019

Это поведение ничего не говорит о спецификациях пространств имен, которые не должны изменяться во время выполнения.В случае, если вам нужно изменить в repl, вам нужно будет перезагрузить / переопределить все спецификации.

...