【问题标题】:clojure: how do I pass a namespace as a macro parameter?clojure:如何将命名空间作为宏参数传递?
【发布时间】:2016-12-01 17:59:27
【问题描述】:

我正在尝试使用 clojure.spec,我想我会编写一个宏来节省一些繁琐的输入:-)

我正在尝试这样做:

(defmacro nup
    [pns pname punit]
    `(s/def :~pns/name (s/and #(string? %) #(= % ~pname)))
    `(s/def :~pns/unit (s/and #(string? %) #(= % ~punit))))

我已经尝试了几个版本,但我无法使命名空间替换工作。有任何想法吗? 不用说,宏不是我的强项。

【问题讨论】:

  • 您不需要任何宏,只需在函数中执行s/def

标签: clojure macros namespaces clojure.spec


【解决方案1】:

你去吧:

(defmacro nup
  [pns pname punit]
  `(do
    (s/def ~(keyword (str pns) "name") (s/and #(string? %) #(= % ~pname)))
    (s/def ~(keyword (str pns) "unit") (s/and #(string? %) #(= % ~punit)))))

(macroexpand-1
  '(nup ab :foo :bar))

但是s/def 只是在规范的注册表中注册了关键字。所以你根本不需要宏。只需使用一个函数,就简单多了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多