2

我正在试验 clojure.spec,我想我会写一个宏来节省一些繁琐的打字:-)

我正在尝试这样做:

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

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

4

1 回答 1

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只需在规范的注册表中注册关键字。所以你根本不需要宏。只需使用一个函数,就容易多了。

于 2016-12-01T19:25:56.793 回答