Почему я не могу использовать регулярные выражения для проверки строк в качестве ключей карты?

В моем проекте Clojure у меня есть такие:

:dependencies [
  [org.clojure/clojure "1.8.0"]
  [prismatic/schema "1.0.5"]]

Это считается действительным:

(require '[schema.core :as s])
(def pos (s/pred #(re-matches #"\d+,\d+" %)))
(s/validate pos "0,0")
; "0,0"

Исходя из этого, я бы подумал, что следующее также будет правильным (но это не так):

(require '[schema.core :as s])
(def pos (s/pred #(re-matches #"\d+,\d+" %)))
(def structure {(s/optional-key pos) s/Any})
(s/validate structure {"0,0" true, "2,0" false})
; Value does not match schema: {"0,0" disallowed-key, "2,0" disallowed-key}

1 ответ

Решение

И как часто случается с этими вещами, я обнаружил ответ вскоре после публикации этого вопроса; Я получил то, что ожидал, когда использовал приведенное ниже определение для structure вместо:

(require '[schema.core :as s])
(def pos (s/pred #(re-matches #"\d+,\d+" %)))
(def structure {pos s/Any})
(s/validate structure {"0,0" true, "2,0" false})
; {"0,0" true, "2,0" false}
Другие вопросы по тегам