Warm tip: This article is reproduced from stackoverflow.com, please click
clojure clojure.spec

How to read Clojure's spec :macro-syntax-check errors

发布于 2020-03-27 10:22:39

I copied the following joy.gui.DynaFrame definition from "Joy of Closure" Chapter 12.2.1

(ns joy.gui
  (:gen-class
   :name joy.gui.DynaFrame
   :extends javax.swing.JFrame
   :implements [clojure.lang.IMeta]
   :prefix df-
   :state state
   :init init
   :constructors {[String] [String]
                  [] [String]}
   :methods [[display [java.awt.Container] void]
   ^{:static true} [version [] String]]
   )
  (:import (javax.swing JFrame JPanel JComponent)
           (java.awt BorderLayout Container)))

Unfortunately, the syntax for :prefix has apparently changed since 2014, so the line 6 should read :prefix "df-".

Evaluating the incorrect code above I got the following error message:

2. Unhandled clojure.lang.Compiler$CompilerException
   Error compiling src/dipping_feet/gui.clj at (1:1)
   #:clojure.error{:phase :macro-syntax-check,
                   :line 1,
                   :column 1,
                   :source

1. Caused by clojure.lang.ExceptionInfo
   Call to clojure.core/ns did not conform to spec.
   #:clojure.spec.alpha{:problems
                        [{:path [],
                          :reason "Extra input",
                          :pred
                          (clojure.spec.alpha/cat
                           :docstring
                           (clojure.spec.alpha/? clojure.core/string?)
                           :attr-map
                           (clojure.spec.alpha/? clojure.core/map?)
                           :ns-clauses
                           :clojure.core.specs.alpha/ns-clauses),
                          :val
                          ((:gen-class
                            :name
                            joy.gui.DynaFrame
                            :extends
                            javax.swing.JFrame
                            :implements
                            [clojure.lang.IMeta]
                            :prefix
                            df-
                            :state
                            state
                            :init
                            init
                            :constructors
                            {[String] [String], [] [String]}
                            :methods
                            [[display [java.awt.Container] void]
                             [version [] String]])
                           (:import
                            (javax.swing JFrame JPanel JComponent)
                            (java.awt BorderLayout Container))),
                          :via [:clojure.core.specs.alpha/ns-form],
                          :in [1]}],
                        :spec
                        #object[clojure.spec.alpha$regex_spec_impl$reify__2509 0x3b982314 "clojure.spec.alpha$regex_spec_impl$reify__2509@3b982314"],
                        :value
                        (joy.gui
                         (:gen-class
                          :name
                          joy.gui.DynaFrame
                          :extends
                          javax.swing.JFrame
                          :implements
                          [clojure.lang.IMeta]
                          :prefix
                          df-
                          :state
                          state
                          :init
                          init
                          :constructors
                          {[String] [String], [] [String]}
                          :methods
                          [[display [java.awt.Container] void]
                           [version [] String]])
                         (:import
                          (javax.swing JFrame JPanel JComponent)
                          (java.awt BorderLayout Container))),
                        :args
                        (joy.gui
                         (:gen-class
                          :name
                          joy.gui.DynaFrame
                          :extends
                          javax.swing.JFrame
                          :implements
                          [clojure.lang.IMeta]
                          :prefix
                          df-
                          :state
                          state
                          :init
                          init
                          :constructors
                          {[String] [String], [] [String]}
                          :methods
                          [[display [java.awt.Container] void]
                           [version [] String]])
                         (:import
                          (javax.swing JFrame JPanel JComponent)
                          (java.awt BorderLayout Container)))}

I omit the stack trace here.

My question is: is there a reference in the error message somewhere which would point me to the exact location of the error in the code? I had to basically guess which part of my definition is incorrect.

Questioner
Dimitri Vorona
Viewed
61
bbrinck 2019-07-04 06:26

Yes, I agree, this is a confusing error message. This appears to be a bug in spec, so unfortunately I don't think there is anything you can do at this time to make the error any better.

https://clojure.atlassian.net/browse/CLJ-2013?oldIssueView=true