【问题标题】:How do I use `clojure.tools.macro/name-with-attributes`?如何使用`clojure.tools.macro/name-with-attributes`?
【发布时间】:2014-08-25 02:11:26
【问题描述】:

我看到对于在clojure.tools.macro 库中编写类似defn 的宏的任何人来说,它有望成为一个漂亮的工具:name-with-attributes 函数。文档字符串说:

用于宏定义。 处理要定义的名称的可选文档字符串和属性映射 在宏参数列表中。如果第一个宏参数是字符串, 它作为文档字符串添加到 name 并从宏参数中删除 列表。如果之后第一个宏参数是一个映射,它的条目是 添加到名称的元数据映射中,并且该映射从 宏参数列表。返回值是一个包含名称的向量 及其扩展的元数据映射和未处理的宏列表 论据。

但我似乎无法在任何地方找到使用此功能的示例。

那么,我如何使用这个函数来定义一个defn2 宏,它应该是clojure.core/defn 的克隆,包含所有相同的功能,包括:

  • 文档字符串
  • 属性图
  • 先决条件
  • 多民族

【问题讨论】:

    标签: macros clojure


    【解决方案1】:

    这里是defn2

    (require '[clojure.tools.macro :as ctm])
    
    (defmacro defn2
      "A clone of `defn`."
      [symb & defn-args]
      (let [[symb body] (ctm/name-with-attributes symb defn-args)]
        `(defn ~symb ~@body)))
    

    查看元数据,我们可以看到它已正确附加:

    (defn2 ^:private add
           "Docstring"
           ([] :foo)
           ([a b] {:pre [(= 1 1)]} (+ a b)))
    
    (pprint (meta #'add))
    

    ...产量:

    {:arglists ([] [a b]),
     :ns #<Namespace user>,
     :name add,
     :column 1,
     :private true,
     :doc "Docstring",
     :line 1,
     :file
     "/private/var/folders/30/v73zyld1359d7jb2xtlc_kjm0000gn/T/form-init8938188655190399857.clj"}
    

    使用上面的defn2 创建了一个add 函数,其工作原理如下:

    (add)     ; => :foo
    (add 1 2) ; => 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多