(defmacro create-func [func-name attr] `(defn ~func-name [person] (~attr person)))
(create-func c-age :age)
当您这样写时,它会展开为
(defn c-age [user/person] (:age user/person))
Syntax error macroexpanding clojure.core/defn at (/tmp/form-init14482279258588584188.clj:1:1).
user/person - failed: vector? at: [:fn-tail :arity-n :bodies :params] spec: :clojure.core.specs.alpha/param-list
(user/person) - failed: Extra input at: [:fn-tail :arity-1 :params] spec: :clojure.core.specs.alpha/param-list
为了避免这种情况,您应该这样写
(defmacro create-func [func-name attr] `(defn ~func-name [person#] (~attr person#)))
或者使用其他方式来不在参数名称中使用限定符号。
为“获取器”创建宏是Clojure中的反模式。
如果您想要访问一个字段,只需直接访问它。
此外,def-macros通常可以写成函数。
(def c-age (im-not-a-macro :age))