标题可能不是100%正确,但让我向您展示这个问题:
(defmacro nvp!
[n width height]
`(q/defsketch (symbol (str (name '~n) "-viewport" ))
:title (name '~n))
简而言之:有一个称为的宏defsketch
(它是lib的一部分quil
,但这没关系)。它的签名基本上是defsketch [applet-name & options]
,并且创建了一些东西并将其绑定到一个名为的var中applet-name
。出于某种原因,我想将其包装到另一个宏中,该宏除其他事项外采用一个applet-name
参数,将该名称扩展为applet-name-viewport
并将其传递给defsketch
。但是,我无法找出正确的方法(在上面的代码中使用macroexpand((pprint (macroexpand(nvp test-name 500 500)))
,
(def(clojure.core/symbol (clojure.core/str (clojure.core/name 'my-namespace.core/test-name) "-viewport"))
(quil.applet/applet
:title (clojure.core/name 'my-namespace.core/test-name)))
(clojure.core/symbol (clojure.core/str (clojure.core/name 'my-namespace.core/test-name) "-viewport")
-这部分看起来不错,但是应该在传递给内部宏之前对其进行某种评估...
您需要取消对生成新符号而不是原始符号本身的表单的引用。
这是一个小示例,说明如何使用defn
内部宏的like宏来完成此操作:
(defmacro mydefn
[name & body]
`(defn ~name ~@body))
(defmacro defnview
[n & body]
`(mydefn ~(symbol (str (name n) "-viewport")) ~@body))
;; OR
(defmacro defnview
[n & body]
(let [n (symbol (str (name n) "-viewport"))]
`(mydefn ~n ~@body)))
例子:
(defnview foo [a] a)
;; => #'user/foo-viewport
(foo-viewport 1)
;; => 1
(macroexpand '(defnview foo [a] a))
;; => (def foo-viewport (clojure.core/fn ([a] a)))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句