【问题标题】:I can't understand the following clojure.spec error我无法理解以下 clojure.spec 错误
【发布时间】:2019-10-31 04:11:58
【问题描述】:

我不明白为什么会出现以下规范错误。

谁能告诉我为什么?

(ns spec-test 
   (:require [clojure.spec.alpha :as s]
             [clojure.spec.test.alpha :as stest]))

;;; spec definitions

(s/def :msds.fontspec/tag #{:fontspec})

(s/def ::id string?)
(s/def ::size int?)
(s/def ::family string?)
(s/def ::color string?)

(s/def :msds.fontspec/attrs 
  (s/keys :req-un [::id ::size ::family ::color]))

(s/def :msds.fontspec/content (s/cat))

(s/def ::fontspec
  (s/keys :req-un [:msds.fontspec/tag :msds.fontspec/attrs :msds.fontspec/content]))

(s/def ::fontspecs (s/* ::fontspec))


;;; spec application

(defn transform-fontspecs
  [fontspecs]
  (->> fontspecs
       (map (fn [{:keys [attrs] :as fontspec}]
              [(get attrs :id) (dissoc attrs :id)] ))
       (into {}) ))

(s/fdef transform-fontspecs
  :args (s/cat :fontspec ::fontspecs))

(stest/instrument `transform-fontspecs)


;;; test code

(def test-sample
  '({:tag :fontspec,
     :attrs {:id "283f1EV", :size 21, :family "c2S6", :color ""},
     :content ()}
    {:tag :fontspec,
     :attrs
     {:id "BzYMt4eEm", :size -5, :family "q0xhOE3", :color "bhV3PsVh"},
     :content ()}
    {:tag :fontspec,
     :attrs {:id "uA2i", :size -5, :family "HHGoD", :color "J47ZX935"},
     :content ()}))

(transform-fontspecs test-sample)

以下是错误描述。

2. 未处理的clojure.lang.Compiler$CompilerException 在 (55:1) 编译 src/spec_test.clj 时出错 #:clojure.error{:phase :compile-syntax-check, :第55行, :第1栏, :源“/home/philos/work/metapdf/src/spec_test.clj”} Compiler.java: 7648 clojure.lang.Compiler/load REPL:1 个 metapdf.core/eval19243 REPL:1 个 metapdf.core/eval19243 Compiler.java:7177 clojure.lang.Compiler/eval Compiler.java: 7132 clojure.lang.Compiler/eval core.clj: 3214 clojure.core/eval core.clj: 3210 clojure.core/eval main.clj: 437 clojure.main/repl/read-eval-print/fn main.clj:437 clojure.main/repl/read-eval-print main.clj: 458 clojure.main/repl/fn main.clj: 458 clojure.main/repl main.clj: 368 clojure.main/repl RestFn.java: 1523 clojure.lang.RestFn/invoke interruptible_eval.clj:79 nrepl.middleware.interruptible-eval/evaluate interruptible_eval.clj:55 nrepl.middleware.interruptible-eval/evaluate interruptible_eval.clj:142 nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn AFn.java:22 clojure.lang.AFn/运行 session.clj: 171 nrepl.middleware.session/session-exec/main-loop/fn session.clj: 170 nrepl.middleware.session/session-exec/main-loop AFn.java:22 clojure.lang.AFn/运行 Thread.java: 748 java.lang.Thread/run 1.由clojure.lang.ExceptionInfo引起 规范断言失败。 规范:#object[clojure.spec.alpha$regex_spec_impl$reify__2509 0x3660c4ee "clojure.spec.alpha$regex_spec_impl$reify__2509@3660c4ee"] 值:(({:标签:字体规范, :attrs {:id "283f1EV",:size 21,:family "c2S6",:color ""}, :内容 ()} {:标签:字体规范, :attrs {:id "BzYMt4eEm",:size -5,:family "q0xhOE3",:color "bhV3PsVh"}, :内容 ()} {:标签:字体规范, :attrs {:id "uA2i",:size -5,:family "HHGoD",:color "J47ZX935"}, :内容 ()})) 问题: val: ({:tag :fontspec, :attrs {:id "283f1EV",:size 21,:family "c2S6",:color ""}, :内容 ()} {:标签:字体规范, :attrs {:id "BzYMt4eEm",:size -5,:family "q0xhOE3",:color "bhV3PsVh"}, :内容 ()} {:标签:字体规范, :attrs {:id "uA2i",:size -5,:family "HHGoD",:color "J47ZX935"}, :内容 ()}) 在:[0] 失败:地图? 规格::规格测试/字体规格 alpha.clj:132 clojure.spec.test.alpha/spec-checking-fn/conform! alpha.clj:140 clojure.spec.test.alpha/spec-checking-fn/fn RestFn.java: 408 clojure.lang.RestFn/invoke spec_test.clj: 55 规格测试/eval19293 spec_test.clj: 55 规格测试/eval19293 Compiler.java:7177 clojure.lang.Compiler/eval Compiler.java: 7636 clojure.lang.Compiler/load REPL:1 个 metapdf.core/eval19243 REPL:1 个 metapdf.core/eval19243 Compiler.java:7177 clojure.lang.Compiler/eval Compiler.java: 7132 clojure.lang.Compiler/eval core.clj: 3214 clojure.core/eval core.clj: 3210 clojure.core/eval main.clj: 437 clojure.main/repl/read-eval-print/fn main.clj:437 clojure.main/repl/read-eval-print main.clj: 458 clojure.main/repl/fn main.clj: 458 clojure.main/repl main.clj: 368 clojure.main/repl RestFn.java: 1523 clojure.lang.RestFn/invoke interruptible_eval.clj:79 nrepl.middleware.interruptible-eval/evaluate interruptible_eval.clj:55 nrepl.middleware.interruptible-eval/evaluate interruptible_eval.clj:142 nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn AFn.java:22 clojure.lang.AFn/运行 session.clj: 171 nrepl.middleware.session/session-exec/main-loop/fn session.clj: 170 nrepl.middleware.session/session-exec/main-loop AFn.java:22 clojure.lang.AFn/运行 .lang.Thread/运行

【问题讨论】:

    标签: clojure clojure.spec


    【解决方案1】:

    您应该检查Problems 部分,其中显示valfailed: map?。 问题是您正在使用像s/* 这样的正则表达式操作,当嵌套时,结构有点扁平化,所以它需要一个映射而不是一个集合。 你应该在这里使用coll-of,恕我直言。 见https://clojure.org/guides/spec#_collections 此外,:msds.fontspec/content 规范可能应该更新为不使用cat,而只使用vector? 或类似的东西。

    【讨论】:

    • 非常感谢!你的回答解决了我的问题。还有一个问题。 :msds.fontspec/content 的规范需要一个空列表。我怎样才能做到这一点?
    • 然后考虑投票:)
    • 我尝试投票,但遗憾的是消息显示“感谢您的反馈!声望低于 15 人的投票将被记录,但不要更改公开显示的帖子得分。”
    猜你喜欢
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多