通过未定义它的命名空间访问clojure宏

时间:2016-01-25 04:17:13

标签: clojure

我在# High score (printed in the corner) c=0 while c>=0: c=c+1 highscore=myfont6.render("High score:",True, THECOLORS["purple"]) score=myfont6.render(c, True, THECOLORS["purple"]) screen.blit(highscore, (20,20)) screen.blit(score,(40,20)) 中定义了一个宏:

func.clj

我希望将其绑定到(ns my-library.func) (defmacro my-macro [arg] `(identity ~arg)) 中的变量:

core.clj

以便我可以执行以下操作:

(ns my-library.core
  (:require [my-library.func :as func])

(def my-macro-core func/my-macro)

但是,我不能这样做,因为宏不会计算为值。以下作品:

(ns script.core
  (:require [my-library.core :as mlc]))

(mlc/my-macro-core :boring-macro) ; -> :boring-macro

但这是多余的,所以我想知道是否有更清洁的方法来做到这一点。

2 个答案:

答案 0 :(得分:2)

这有点像黑客,但可以做到:

(ns my-library.func)

(defmacro my-macro [arg]
  `(identity ~arg))

(ns my-library.core
  (:require [my-library.func :as func]))

(def ^:macro my-macro-core @#'func/my-macro)

(ns script.core
  (:require [my-library.core :as mlc]))

(mlc/my-macro-core :boring-macro)

诀窍是将新的var定义为别名宏的原始函数值,同时设置:macro元数据标志,以便编译器识别它并适当地调用它。

答案 1 :(得分:0)

Potemkin的import-vars支持宏:

(require '[potemkin :refer [import-vars]])
(import-vars [my-library.core my-macro])