(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#)))
或者使用另一种不使用有资格的符号作为参数名的方法。
为 "getter" 创建宏是 clojure 中的一个反模式。
如果你想访问一个字段,只需访问它。
此外,def-macros 通常可以写成函数的形式。
(def c-age (im-not-a-macro :age))