Clojure中的嵌套宏

Clojure中的嵌套宏,clojure,clojurescript,Clojure,Clojurescript,考虑以下伪代码: (defrc name "string" [a :A] [:div a]) 如果defrc是一个宏,它将扩展到以下内容 (let [a (rum/react (atom :A))] (rum/defc name < rum/reactive [] [:div a])) (让[a(rum/react(atom:a))] (rum/defc名称

考虑以下伪代码:

(defrc name
  "string"
    [a :A]
    [:div a])
如果defrc是一个宏,它将扩展到以下内容

(let [a (rum/react (atom :A))]
  (rum/defc name < rum/reactive []
    [:div a]))
(让[a(rum/react(atom:a))]
(rum/defc名称
其中rum/defc本身就是一个宏。我想出了下面的代码:

(defmacro defrc
          [name subj bindings & body]
          (let [map-bindings# (apply array-map bindings)
                keys# (keys map-bindings#)
                vals# (vals map-bindings#)
                atomised-vals# (atom-map vals#)]
               `(let ~(vec (interleave keys# (map (fn [v] (list 'rum/react v)) (vals atomised-vals#))))
                     (rum/defc ~name < rum/reactive [] ~@body))))
(defmacro defrc
[名称主题绑定和正文]
(让[映射绑定#(应用数组映射绑定)
键(键映射绑定)
VAL(VAL映射绑定)
原子化VAL(原子映射VAL)]
`(让~(vec)(交错键)(map(fn[v](list'rum/react v))(vals原子化vals#))
(rum/defc~name
这几乎奏效了:

(macroexpand-all '(defrc aname
       #_=>   "string"
       #_=>   [a :A]
       #_=>   [:div a]))
(let* [a (rum/react #object[clojure.lang.Atom 0x727ed2e6 {:status :ready, :val nil}])] (rum/defc aname clojure.core/< rum/reactive [] [:div a]))
(宏全部展开)(defrc aname
#_=>“字符串”
#_=>[a:a]
#_=>[:div a]))
(let*[a(rum/react#object[clojure.lang.Atom 0x727ed2e6{:status:ready,:val nil}])(rum/defc aname clojure.core/
但是,使用时会导致语法错误:

ERROR: Syntax error at (clojure.core/< rum.core/reactive [] [:div a])
ERROR:clojure.core/

这是因为内部宏没有被扩展吗?

证明宏工作正常,但出现问题的原因是...(cond (and (empty? res) (symbol? x)) (recur {:name x} next nil) (fn-body? xs) (assoc res :bodies (list xs)) (every? fn-body? xs) (assoc res :bodies xs) (string? x) (recur (assoc res :doc x) next nil) (= '< x) (recur res next :mixins) (= mode :mixins) (recur (update-in res [:mixins] (fnil conj []) x) next :mixins) :else (throw (IllegalArgumentException. (str "Syntax error at " xs))))...